【问题标题】:Resetting Mockito Spy重置 Mockito Spy
【发布时间】:2013-02-26 13:28:10
【问题描述】:

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

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

【问题讨论】:

  • 我在programmers.stackexchange.com/questions/188299/… 上问了一个类似的问题。仅供参考,尽管这与模拟而非间谍有关。
  • 您在哪里尝试将呼叫添加到reset?也许编辑您的代码以显示您的尝试,但被注释掉了?
  • 我只附加了原型示例,我尝试在@BeforeMethod\@BeforeClass 中进行重置,与@After 相同,甚至在验证之前 - 它也没有用。据我了解,这只是间谍的问题,而重置仅适用于模拟对象。

标签: java unit-testing mocking mockito


【解决方案1】:

来自 Mockito documentation

重置模拟(自 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(); 
        ...
    }
}

【讨论】:

  • 我不明白您为什么说现在每个测试都需要预期两次调用。间谍是在每个测试方法之前重建的。
  • 谢谢,实际上它帮助了我,但如果你使用 @InjectMocks 和其他注释,你还需要调用 initmocks,这看起来不那么漂亮。
  • 所以如果我使用@Spy,我必须为每个测试设置不同的字段?这看起来很丑陋,并且除了在非常微不足道的情况下之外,使@Spy 变得毫无意义,并且在具有多个测试方法的测试类中陷入困境。我只花了 30 分钟发现由于 @Spy 没有在测试之间重置,我的测试的运行顺序会影响结果。一定有办法在@AfterTests 或@BeforeTests 的开头重置间谍?
  • 您可以在使用@BeforeMethod(或@Before with JUnit)注释的方法中重置间谍,就像我在示例中所做的那样,有什么问题?
猜你喜欢
  • 2015-04-02
  • 2019-07-09
  • 2019-07-28
  • 2023-03-20
  • 2017-10-11
  • 1970-01-01
  • 2014-03-24
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多