12

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

这有效:

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),但它根本没有帮助我。

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

4

1 回答 1

15

从 Mockito文档

重置模拟(自 1.8.0 起)

Smart Mockito 用户几乎不使用此功能,因为他们知道这可能是测试不佳的标志。通常,您不需要重置模拟,只需为每个测试方法创建新的模拟。请考虑在冗长、过度指定的测试中编写简单、小型且集中的测试方法,而不是 reset()。第一个潜在的代码异味是在测试方法中间的 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(); 
        ...
    }
}
于 2013-02-26T13:47:41.823 回答