这是个好问题!我认为其根本原因是以下原因,我们不仅将JUnit用于单元测试。因此,应该对问题进行分解:
- 我是否应该在集成测试(或任何其他高于单元的测试)中使用Mockito.verify()?
- 我应该在黑盒单元测试中使用Mockito.verify()吗?
- 我应该在白盒单元测试中使用Mockito.verify()吗?
因此,如果我们忽略单元测试以上的问题,可以改写以下问题:“ 将白盒单元测试与Mockito.verify()结合使用,可以在单元测试和我的can实施之间建立很好的结合,我可以将一些“灰盒“单元测试以及对此应该使用的经验法则 ”。
现在,让我们逐步完成所有这些步骤。
*-我是否应该在集成测试(或任何其他高于单元测试的测试)中使用Mockito.verify()?*我认为答案显然不是,此外,您不应为此使用模拟。您的测试应尽可能接近实际应用。您正在测试完整的用例,而不是应用程序的独立部分。
* 黑盒与白盒单元测试 *如果您使用黑盒方法,您实际上在做什么,那么您将提供(所有等效类)输入,状态并测试您将收到预期的输出。在这种方法中,通常使用模拟是有道理的(您只是模仿它们在做正确的事;您不想测试它们),但是调用Mockito.verify()是多余的。
如果您使用的是白盒方法,那么您实际上正在做什么,那么您正在测试单元的行为。在这种方法中,调用Mockito.verify()是必不可少的,您应该验证单元的行为符合预期。
灰盒测试
的经验法则白盒测试的问题是它会产生很高的耦合度。一种可能的解决方案是进行灰盒测试,而不是白盒测试。这是黑白盒测试的组合。就像在白盒测试中一样,您实际上是在测试单元的行为,但总的来说,在可能的情况下,使其与实现无关。如果可能的话,您将像在黑盒中那样进行检查,只是断言输出是您期望的结果。因此,您的问题的实质是何时有可能。
这真的很难。我没有一个很好的例子,但是我可以举几个例子。在上面用equals()vs equalsIgnoreCase()提到的情况下,您不应该调用Mockito.verify(),只需声明输出即可。如果您无法执行此操作,请将代码分解为较小的单元,直到可以执行为止。另一方面,假设您有一些@Service,并且正在编写@ Web-Service,它实际上是对@Service的包装-它将所有调用委派给@Service(并进行一些额外的错误处理)。在这种情况下,调用Mockito.verify()是必不可少的,您不应复制对@Serive所做的所有检查,以验证您使用正确的参数列表来调用@Service就足够了。