我有一个测试类(基于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异常,我有一个someMethodNeedToBeChecked
方法的调用。当然我试图添加Mockito.reset(testObject)
但它根本没有帮助我。
如果我需要在多个测试中验证相同的方法,如何重置间谍对象?
答案 0 :(得分:13)
来自Mockito documentation:
重置模拟(自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();
...
}
}