java - 无法弄清楚为什么验证无法正常工作

标签 java unit-testing testng mockito

我有一个奇怪的测试代码,它总是绿色的。同时,其中一项测试不应该是绿色的。请看下面的代码。

这是一个我需要测试的类

public class A {
    private String param;

    public void print(){
        System.out.println(this.param);
    }

    public static void printHello(){
        System.out.println("Hello!");
    }
}

自己测试

import org.mockito.Spy;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.powermock.api.easymock.PowerMock.replay;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.verifyStatic;
import static org.powermock.reflect.Whitebox.invokeMethod;

public class ATest {
    @Spy
    private A a = new A();

    @BeforeMethod
    public void setUp() {
        initMocks(this);
    }

    @Test
    public void test() {

        // When
        a.print();

        // Than
        verify(a, times(1)).print();
    }

    @Test
    @PrepareForTest(A.class)
    public void testStatic() throws Exception {
        mockStatic(A.class);
        replay();
        invokeMethod(A.class, "printHello");
        verifyStatic(times(10)); // must be fail
    }
}

显然方法 testStatic() 应该失败,因为它不会调用 10 次。

UPD

这是我的新版本测试

@PrepareForTest(A.class)
public class ATest extends PowerMockTestCase {

    @Spy
    private A a = new A();

    @BeforeMethod
    public void setUp() {
        initMocks(this);
    }

    @Test
    public void test() {

        // When
        a.print();

        // Than
        verify(a, times(1)).print();
    }

    @Test
    @PrepareForTest(A.class)
    public void testStatic() throws Exception {
        mockStatic(A.class);
        replay();
        invokeMethod(A.class, "printHello");
        verifyStatic(times(10)); // must be fail
    }

    @ObjectFactory
    public IObjectFactory getObjectFactory() {
        return new org.powermock.modules.testng.PowerMockObjectFactory();
    }
}

错误堆栈跟踪

org.mockito.exceptions.verification.TooManyActualInvocations: 
a.print();
Wanted 1 time:
-> at com.aaron.simple.ATest.test(ATest.java:37)
But was 2 times. Undesired invocation:
-> at com.aaron.simple.ATest.test(ATest.java:34)

最佳答案

我觉得测试类应该注解@RunWith(PowerMockRunner.class)

没有这个 Powermock 基本上什么都不做。

好的,您使用 TestNG。它仍然需要等效的信息。 setup is described here在“配置 TestNG 以使用 PowerMock 对象工厂”一节中。

关于java - 无法弄清楚为什么验证无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24632666/

相关文章:

java - 多个浏览器配置文件用于多个(并发)测试执行?

Java - 逐字符读取文本文件的最快方法

java - 模拟带有延迟的 void 方法

java - 根据从数据库检索的数据设置变量

unit-testing - 如何测试一个 React 组件是否包含另一个带有 Tape 和 Enzyme 的组件?

c# - 无法初始化模拟类的成员

android - 模拟对象仍在调用方法(Mockito + Kotlin)

java - 如何在 TestNg 类之间传递 WebDriver 的单个实例

java - Hibernate的MariaDB方言类名称是什么?

java - Maven 项目中测试资源的公共(public)位置