【问题标题】:Can't figure out why verification doesn't work properly无法弄清楚为什么验证无法正常工作
【发布时间】:2014-08-29 05:43:24
【问题描述】:

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

这是一个我需要测试的类

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)

【问题讨论】:

  • 您正在使用默认的 JUnit 运行器运行测试。添加注解@RunWith(PowerMockRunner.class)
  • 我没有使用 JUnit。只是 TestNG。
  • 那么你需要一个@ObjectFactory:more info here。它的 TestNG 相当于 @RunWith 在 JUnit 中所做的
  • 好吧!我更新了我的帖子。
  • 这是一个完全不同的问题。

标签: java unit-testing testng mockito


【解决方案1】:

我认为测试类应该用@RunWith(PowerMockRunner.class)注解

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

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

【讨论】:

  • 回滚编辑,因为它将可用的答案变成了仅链接的答案。
【解决方案2】:

JUnit 为每个测试方法创建一个新实例,相反的 TestNG 为整个套件创建一个单独的测试实例。这意味着您的实例变量不会在测试方法之间重置。

测试应该更新实例字段,或者让 Mockito 重置它们 (Mockito.reset(...))。

请注意,您可以在 Mockito 项目中找到一些 TestNG utility classes,但它们尚未分发,但有助于以与 JUnit 相同的方式创建模拟。然而,由于模拟是使用 PowerMock 创建的,所以情况就不同了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多