重置莫基托间谍

2022-09-04 20:41:23

我有一个测试类(基于TestNG),我用于间谍对象。Mockito.verify

这有效:

public class Program {
    @Spy
    private TestObject testObject;

    @Test
    public void test1() {
       testObject.makeSth(); 
       verify(testObject, only()).someMethodNeedToBeChecked(); 
    }
}

但在这里:

public class Program {
    @Spy
    private TestObject testObject;

    @Test
    public void test1() {
       testObject.makeSth(); 
       verify(testObject, only()).someMethodNeedToBeChecked(); 
    }

    @Test
    public void test2() {
        // Some different scenario
       testObject.makeSth(); 
       verify(testObject, only()).someMethodNeedToBeChecked(); 
        ...
    }
}

我得到一个Mokito异常,我有更多的方法调用。当然,我试图添加,但它根本没有帮助我。someMethodNeedToBeCheckedMockito.reset(testObject)

如果我需要在多个测试中验证相同的方法,如何重置间谍对象?


答案 1

从 Mockito 文档

重置模拟(自 1.8.0 起)

Smart Mockito用户几乎不使用此功能,因为他们知道这可能是测试不佳的迹象。通常,您不需要重置模拟,只需为每个测试方法创建新的模拟即可。与其使用 reset() ,不如考虑编写简单、小巧且重点突出的测试方法,而不是冗长、过度指定的测试。第一个潜在的代码异味是在测试方法的中间重置()。这可能意味着你测试得太多了。遵循你的测试方法的低语:“请让我们保持小,专注于单一行为”。在mockito邮件列表上有几个关于它的线程。

我们添加 reset() 方法的唯一原因是可以使用容器注入的模拟。

您可能应该在以下位置重新创建间谍:@BeforeMethod

public class Program {

    private TestObject testObject = new TestObject();
    private TestObject spyTestObject;

    @BeforeMethod
    public void buildSpy() {
        spyTestObject = spy(testObject);
    }

    @Test
    public void test1() {
       spyTestObject.makeSth(); 
       verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
    }

    @Test
    public void test2() {
        // Some different scenario
       spyTestObject.makeSth(); 
       verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
        ...
    }
}

答案 2

推荐