如何使用Mockito打印带有mock的所有交互

neekobn8  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(93)

假设我必须在ClassA上写一些测试,其中有一个ClassB作为成员,而我正在模拟ClassB
在测试的最后,我想使用verify(..)verifyNoMoreInteractions(..)来设置所有模拟调用的行为和验证。
假设mock有10多个与不同方法的交互。
有没有什么方法可以让JUnit打印所有的模拟交互,然后在代码中使用它?
现在我只是在阅读代码,寻找调用,然后在测试中编写验证行。我相信有一个更简单的方法(TDD在我的情况下是不可能的:))
我的用例:我有一个类,它的算法使用了很多我模拟的其他类。在添加一个调用大量其他方法的新方法时,我想确保只有x数量的方法被调用了y数量的次数,因为代码现在正在工作。这将确保如果有人在将来更改了一些东西,比如错误地调用了一个方法5次而不是4次,那么测试将失败。

qnyhuwrf

qnyhuwrf1#

您可以使用MockingDetailsprintInvocationsgetInvocations来检查属于mock的交互。但是,这不会按照发生的顺序生成属于多个模拟的调用列表:仅仅是与每个模拟对象的交互。
代码片段,由elhefeAnand Rockzz贡献:

import static org.mockito.Mockito.mockingDetails;

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

字符串
承认你在评论中的不情愿和警告,我想说,这是一种技术,它更多地是“锁定你当前的实现”,而不是“分析你真实的的限制并防止回归”。此外,如果您的算法与直接合作者有很多交互,这可能表明应该重构算法。
如果系统是未测试的或未记录的遗留代码,这可能是一种以编程方式生成回归测试或分析的实用方法-一个临时的起点,用于更有见地的回归测试-但在你的鞋子里,我会从记录每个组件的契约开始,然后编写一个确认这些交互和约束的测试。正如Mockito的原始开发人员Szczepan Faber在the article "is there a difference between asking and telling?"中所描述的那样,Mockito的建议倾向于添加存根,直到测试通过,并且只在存在昂贵或非幂等副作用的情况下添加验证/计数。

相关问题