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

4

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

这是我需要测试的类:

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次。
更新:这是我的新版本测试。
@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) - blgt
我不使用JUnit,只用TestNG。 - Aaron
那么你需要一个 @ObjectFactory更多信息在此处。这是TestNG中与JUnit中的 @RunWith 所做的相当的东西。 - blgt
好的!我更新了我的帖子。 - Aaron
那是一个完全不同的问题。 - Jens Schauder
2个回答

2

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

如果没有这个,Powermock基本上什么也做不了。

好的,您正在使用TestNG。它仍然需要等效的信息。在“配置TestNG使用PowerMock对象工厂”部分中描述了设置


因为它将一个可用的答案变成了一个仅包含链接的答案,所以撤销了编辑。 - Jens Schauder

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接