java - 使用 PowerMock 模拟枚举时静态字段为 Null

标签 java junit mockito powermock

我已经编写了一个线程池,但无法为该类编写 Junits(PowerMock)。

public enum ThreadPool {
INSTANCE;

private static final String THREAD_POOL_SIZE = "threadpool.objectlevel.size";
private static TPropertyReader PROP_READER = new PropertyReader();
private final ExecutorService executorService;
private static final ILogger LOGGER = LoggerFactory
        .getLogger(ReportExecutorObjectLevelThreadPool.class.getName());

ThreadPool() {
    loadProperties();
    int no_of_threads = getThreadPoolSize();
    executorService = Executors.newFixedThreadPool(no_of_threads);

}

public void submitTask(Runnable task) {
    executorService.execute(task);
}

private static void loadProperties() {
    try {
        PROP_READER.loadProperties("Dummy");
    } catch (final OODSystemException e) {
        LOGGER.severe("Loading properties for app failed!");
    }
}

private int getThreadPoolSize() {
    return Integer.valueOf(PROP_READER
            .getProperty(THREAD_POOL_SIZE));
}
}

在模拟此类时,我在 PROP_READER.loadProperties("DUMMY");

行中收到 NullPointerException

我的测试用例是:-

PowerMockito.whenNew(PropertyReader.class).withNoArguments().thenReturn(mockPropertyReader);
PowerMockito.doNothing().when( mockPropertyReader,"loadProperties",anyString());
mockStatic(ThreadPool.class);

最佳答案

首先,您需要设置枚举的内部状态,因为枚举是最终类 并且枚举的实例将在类加载时加载

ThreadPool mockInstance = mock(ThreadPool .class);
Whitebox.setInternalState(ThreadPool.class, "INSTANCE", mockInstance);

然后

PowerMockito.mockStatic(ThreadPool .class);

然后 mock

doNothing().when(mockInstance).loadProperties(any(String.class));

不要忘记在测试中添加以下注释

@RunWith(PowerMockRunner.class)
@PrepareForTest({ThreadPool.class})

如果它仍然不起作用,您需要查看需要在内部状态中设置类的哪些成员

关于java - 使用 PowerMock 模拟枚举时静态字段为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30276989/

相关文章:

java - Spring 中 @Autowired 的替代方案,它不会在测试类设置之前初始化 bean

java - 如何仅在运行时(即运行 JUnit 时)实例化 redis 实例

java - 对来自 NetBeans 的 Web 服务客户端进行单元测试

gradle - 如何在JUnit测试执行期间添加Java系统属性

GWT 和 MVP 模式中的 Mock View

java - Mockito 相当于 EasyMock 的 MockBuilder

mocking - 如何将 @InjectMocks 和 initMocks() 与具有必需 String 参数的对象一起使用?

java - 将 2 个字符串与条件进行比较

java - 具有方法匹配的 Java 中的正则表达式

java - 在没有 closeFuture().sync() 的情况下在 Netty 中运行多个服务器