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

Java 使用powermockito验证静态void方法的调用,java,unit-testing,junit,mockito,powermock,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(

我试图在一个静态类中捕获“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));
}

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

验证静态后,您缺少一行代码。您没有告诉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.
}
您可能仍然需要进行一些调试,因为根据我的经验,设置期望有时会调用底层方法

以下是
spy
的javadoc:


下面是用于验证静态的javadoc:Done。我没有使用最新版本,因为我没有用它重新测试。