所以假设我必须在ClassA
上写一些ClassB
作为成员的测试,我正在嘲笑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());
在评论中确认您的不愿和警告,我想说的是,这是一种对您当前实施的锁定的技术,而不是分析您的实际约束并防止回归。此外,如果您的算法与直接合作者有很多互动,则可能表明该算法应进行重构。
如果系统未经测试或无证件遗产代码,这可能是一种实用的方法,可以在编程中生成回归测试或分析 - a 临时起点用于更明智的回归测试 - 但相反,我的鞋子首先要记录每个组件的合同,然后编写确认这些互动和约束的测试。如文章中所述,问和讲述之间有区别吗?"通过Mockito的原始开发人员Szczepan Faber),Mockito的建议倾向于添加存根,直到测试通过并仅在昂贵或非目标副作用的情况下添加验证/计数。