PowerMockito.verifyStatic() Problem

2022-09-04 05:28:57

我需要使用PowerMockito来测试是否调用了特定的静态方法。我正在使用以下PowerMockito和JUnit库...

  • powermock-mockito-1.6.2-full.jar
  • 朱尼特-4.12.jar

我在使PowerMockito.verifyStatic()方法正常工作时遇到问题。在下面的代码示例中,我尝试使用@PrepareForTest和 mockStatic(),并尝试排除它们。在代码示例中,我包括了它们。

测试类:

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Test1.class)
public class PowerMockTest {
    @Test
    public void staticVerifyTest() {
        PowerMockito.mockStatic(Test1.class);

        // Test
        PowerMockito.verifyStatic();
        //Test1.staticMethod();
    }
}

测试中的类:

public class Test1 {
    public static void staticMethod() {
        System.out.println("Static Method!");
    }
}

测试在运行时通过,但它应该失败,因为从不调用 Test1.staticMethod()。任何这方面的帮助将不胜感激!


答案 1

好吧,多亏了Stefan Birkner的参考,我想通了

以下是对我的示例代码的更正:

import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Test1.class)
public class PowerMockTest {
    @Test
    public void staticVerifyTest() {
        PowerMockito.mockStatic(Test1.class);
        // Test
        Test1.staticMethod();
        PowerMockito.verifyStatic();
        Test1.staticMethod();
    }
}

调用静态方法后,需要通过在 verifyStatic() 调用后再次调用它来验证它是否被调用。

        Test1.staticMethod();
        PowerMockito.verifyStatic();
        Test1.staticMethod();

您还可以检查它是否被多次调用,如下所示...

Test1.staticMethod();
Test1.staticMethod();
Test1.staticMethod();
PowerMockito.verifyStatic(Mockito.times(3));
Test1.staticMethod();

答案 2

这本身不是一个答案,而是A)确认Oliver关于方法更改的评论在PowerMock 2.0.2和B中仍然有效)一个注释,其中包含有关其工作原理的其他信息。

PowerMockito.verifyStatic() 调用 Mockito.verify(),后者在其 Javadoc 中提供了一些示例:

verify(mock, times(5)).someMethod("was called five times");
verify(mock, atLeast(2)).someMethod("was called at least two times");

由于此 sintax 不再可用,我们需要 2 行代码来声明验证规则。使用John的例子,这意味着前3行将是“实际的”业务调用,而verifyStatic之后的行只是告诉它哪个调用计数器必须与第二个参数匹配:

PowerMockito.mockStatic(Test1.class);

// Test
Test1.staticMethod();
Test1.staticMethod();
Test1.staticMethod();

// Validation
PowerMockito.verifyStatic(Test1.class, Mockito.times(3));
Test1.staticMethod();

推荐