假设我必须在 ClassA
上编写一些测试有一个ClassB
作为成员(member),我在 mock ClassB
.
在测试结束时,我想使用 verify(..)
和 verifyNoMoreInteractions(..)
为所有模拟调用设置行为和验证。
假设模拟与不同方法有 10 多个交互。
有没有办法让 JUnit 打印所有模拟交互,然后在代码中使用它?
现在我只是阅读代码并查找调用,而不是在测试中编写验证行。我确信有一种更简单的方法(在我的情况下 TDD 是不可能的 :))
我的用例:我有一个类,其算法使用了我模拟的许多其他类。在添加一个调用大量其他方法的新方法时,我想确保只有 x 数量的方法被调用 y 次,因为代码现在可以工作。这将确保如果将来有人更改某些内容,比方说错误调用一个方法 5 次而不是 4 次,那么测试将失败。
最佳答案
您可以使用 MockingDetails和 printInvocations
或 getInvocations
来检查属于模拟的交互。但是,这不会按照发生的顺序生成属于多个模拟的调用列表:仅与每个单独的模拟进行交互。
代码片段,由 elhefe 提供和 Anand Rockzz :
import static org.mockito.Mockito.mockingDetails;
System.out.println(mockingDetails(mock).printInvocations());
/* or */
System.out.println(mockingDetails(mock).getInvocations());
承认您在评论中的不情愿和警告,我会说这是一种锁定您当前实现的技术,而不是分析您的实际约束并防止回归 em>。此外,如果您的算法与直接合作者有很多交互,这可能表明该算法应该重构。
如果系统是未经测试或未记录的遗留代码,这可能是一种以编程方式生成回归测试或分析的实用方法——一个临时起点,用于更明智的回归测试——但在你的鞋子 我会先记录每个组件的契约,然后编写一个测试来确认这些交互和约束。 Mockito 建议(通过 this article by Mockito's original developer 暗示)倾向于在测试通过之前添加 stub ,并且仅在存在昂贵或非幂等副作用的情况下添加验证/计数。
关于java - 如何使用 Mockito 打印与模拟的所有交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40781857/