Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';我不明白为什么验证不能';我不能正常工作_Java_Unit Testing_Testng_Mockito - Fatal编程技术网

Java Can';我不明白为什么验证不能';我不能正常工作

Java Can';我不明白为什么验证不能';我不能正常工作,java,unit-testing,testng,mockito,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!");

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

这是一门我需要测试的课

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。它仍然需要同等的信息。在“配置TestNG以使用PowerMock对象工厂”一节中,JUnit为每个测试方法创建一个新实例,反之,TestNG为整个套件创建一个测试实例。这意味着您的实例变量不会在测试方法之间重置

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


注意,您可以在Mockito项目中找到一些,但是它们还没有发布,但是可以帮助以与JUnit相同的方式创建mock。但是,由于mock是用PowerMock创建的,所以情况就不同了。

您使用默认的JUnit运行程序运行测试。添加注释
@RunWith(PowerMockRunner.class)
我没有使用JUnit。只需TestNG。然后您需要一个
@ObjectFactory
:。它相当于JUnitO中的
@RunWith
所做的TestNG!我更新了我的帖子。这是一个完全不同的问题。回滚了编辑,因为它将一个可用的答案变成了一个仅链接的答案。