在源代码的run方法中调用时,PowerMockito static mock无效

时间:2018-06-03 18:21:31

标签: mockito powermockito

我有一个静态类,它在静态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中缺少的东西。

0 个答案:

没有答案