重置Mockito间谍

时间:2013-02-26 13:28:11

标签: java unit-testing mocking mockito

我有一个测试类(基于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)但它根本没有帮助我。

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

1 个答案:

答案 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(); 
        ...
    }
}