使用powermockito验证静态void方法的调用

时间:2014-03-04 19:09:10

标签: java unit-testing junit mockito powermock

我试图捕获静态类中的'logError'方法(在每个方法/字段的意义上都是静态的),并验证它已被同一类中的其他方法调用了若干次。

这个方法是:

public static void logError(Object message){
    LOGGER.error(message); // static logger
}

我尝试测试它:

@Test
public void errLogTest() throws Exception{
    PowerMockito.mockStatic(X.class);
    PowerMockito.doNothing().when(X.class);
    X.logError(Mockito.anyString());
    X.open();
    X.open(); //should log error for opening twice
    PowerMockito.verifyStatic(Mockito.times(1));
}

我的问题是,无论我指定了多少次,它都会通过。我删除了模拟行为,并且知道记录器被调用一次,但我可以改为PowerMockito.verifyStatic(Mockito.times(9001));而它仍然通过。我该如何测试?

1 个答案:

答案 0 :(得分:6)

您在verifyStatic之后缺少一行代码。您没有告诉PowerMock 要验证的内容。你也在嘲笑所有类的静态方法,而不仅仅是你不想要的方法。

@Test
public void errLogTest() throws Exception{
    PowerMockito.spy(X.class); //Used to be: PowerMockito.mockStatic(X.class);
    PowerMockito.doNothing().when(X.class);
    X.logError(Mockito.anyString());
    X.open();
    X.open(); //should log error for opening twice
    PowerMockito.verifyStatic(Mockito.times(1));
    X.logError(Mockito.anyString()); //Now verifyStatic knows what to verify.
}

您可能仍需要进行一些调试,因为根据我的经验,设置期望有时会调用基础方法。

以下是spyhttp://static.javadoc.io/org.powermock/powermock-api-mockito/1.5.4/org/powermock/api/mockito/PowerMockito.html#spy(java.lang.Class)

的javadoc

以下是verifyStatichttp://static.javadoc.io/org.powermock/powermock-api-mockito/1.5.4/org/powermock/api/mockito/PowerMockito.html#verifyStatic(org.mockito.verification.VerificationMode)

的javadoc