如何使用 Mockito 打印与模拟的所有交互

2022-09-02 12:51:13

因此,假设我必须写一些测试,该测试具有作为成员,我正在嘲笑。ClassAClassBClassB

在测试结束时,我想使用并设置所有模拟调用的行为和验证。verify(..)verifyNoMoreInteractions(..)

假设模拟有10多个不同方法的交互。

有没有办法让JUnit打印所有模拟交互,然后在代码中使用它?

现在,我只是在阅读代码并查找调用,而不是在测试中编写验证行。我相信有更简单的方法(TDD在我的情况下是不可能的,:))

我的用例:我有一个类,它的算法使用了很多我模拟的类。在添加一个调用大量其他方法的新方法时,我想确保只有x个方法被调用y次,因为代码现在工作。这将确保如果有人将来更改某些内容,假设错误地调用方法5次而不是4次,那么测试将失败。


答案 1

您可以使用 MockingDetails 和 或 来检查属于模拟的交互。但是,这不会按发生的顺序生成属于多个模拟的调用列表:只是与每个单独的模拟进行交互。printInvocationsgetInvocations

代码片段,由elhefeAnand Rockzz贡献:

import static org.mockito.Mockito.mockingDetails;

System.out.println(mockingDetails(mock).printInvocations());
/* or */
System.out.println(mockingDetails(mock).getInvocations());

承认您在评论中的不情愿和警告,我想说这是一种技术,它更多地是为了锁定您当前的实现,而不是分析您的实际约束并防止回归。此外,如果您的算法与直接协作者有很多交互,则可能表明应该重构算法。

如果系统是未经测试或未记录的旧代码,这可能是以编程方式生成回归测试或分析的实用方法 - 这是更明智的回归测试的临时起点 - 但从您的角度来看,我将从记录每个组件的契约开始,然后编写一个确认这些交互和约束的测试。Mockito的建议(正如Mockito的原始开发人员在本文中所暗示的那样)倾向于添加存根,直到测试通过,并且仅在存在昂贵或非幂等副作用的情况下添加验证/计数。


答案 2

推荐