我有一个静态类,它在静态hashmap中具有加载的属性(在启动时)。这将在整个应用程序中使用,可以通过发送属性名称及其类型来使用。我在我的测试类中完成了这个类的静态模拟,如下所示 - PropertyLoader类。
@BeforeClass
public static void initialize(){
Logger logger = null;
logger = PowerMockito.mock(Logger.class);
PowerMockito.mockStatic(Logger.class);
PowerMockito.when(Logger.getLogger(any(Class.class))).thenReturn(logger);
PowerMockito.when(Logger.getLogger(anyString())).thenReturn(logger);
PowerMockito.mockStatic(PropertyLoader.class);
PowerMockito.when(PropertyLoader.getProperty("KEY_PROP","TYPE")).thenReturn("VALUE");
}
我正在观察奇怪的行为,在我的executorservice实现中,它能够在某个时间/随机读取模拟属性,并在重复调用后失败。
为了测试这个,我添加了下面的循环来访问相同的属性,以测试在循环内调用getProperty时它是否可以读取99次值。当在普通/非内部运行块中使用时,它能够读取相同的属性/显示99次。
class TestExecutor
{
ExecutorService jobExecutorService = Executors.newSingleThreadExecutor();
public void checkProperties(){
jobExecutorService.submit(new JobTask());
}
private class JobTask implements Runnable{
@Override
public void run() {
for(int i=0;i<100;i++){
try{
String val = PropertyLoader.getProperty("KEY_PROP", "TYPE");
System.out.println(i + " counter -- TYPE value in executor "+val);
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
以下是输出 -
0 counter -- TYPE value in executor VALUE
1 counter -- TYPE value in executor VALUE
2 counter -- TYPE value in executor VALUE
3 counter -- TYPE value in executor VALUE
java.lang.NullPointerException
at com.******PropertyLoader.cacheLoad(PropertyLoader.java:117)
at com.******PropertyLoader.getProperty(PropertyLoader.java:94)
at com.******.ExecuteTaskTesting$TestExecutor$JobTask.run(ExecuteTaskTesting.java:227)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
java.lang.NullPointerException
at com.******PropertyLoader.cacheLoad(PropertyLoader.java:117)
at com.******PropertyLoader.getProperty(PropertyLoader.java:94)
at com.******Testing$TestExecutor$JobTask.run(ExecuteTaskTesting.java:227)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
此计数器值是随机的。任何人都可以解释我在Powermockito中缺少的东西。