所以,让我们说我必须在ClassA
成为ClassB
成员并且我嘲笑ClassB
的情况下编写一些测试。
在测试结束时,我想使用verify(..)
和verifyNoMoreInteractions(..)
来设置所有模拟调用的行为和验证。
让我们说模拟与不同方法的交互超过10次。
有没有办法让JUnit打印所有的模拟交互,然后在代码中使用它?
现在我只是阅读代码并查找调用,而不是在测试中编写验证行。我确信有一种更简单的方法(TDD在我的情况下不可能:) :)
我的用例:我有一个带有算法的类,它使用了很多我模拟的其他类。在添加一个调用大量其他方法的新方法时,我想确保在代码工作时只调用了多少个方法。这将确保如果有人在将来改变某些事情,让我们说错误地调用方法5次而不是4次,那么测试将会失败。
答案 0 :(得分:16)
您可以使用MockingDetails和printInvocations
或getInvocations
来检查属于模拟的互动。但是,这不会按照发生的顺序生成属于多个模拟的调用列表:只是与每个模拟的交互。
在评论中承认您的不情愿和警告,我会说这是一种技术,可以锁定您当前的实施,而不是分析您的实际约束并防止回归。此外,如果您的算法与直接协作者有很多交互,那么可能表明该算法应该被重构。
如果系统是未经测试或未记录的遗留代码,这可能是以编程方式生成回归测试或分析的实用方法 - 一个临时起点,用于更明智的回归测试 - 但是换句话说,我首先记录每个组件的合同,然后编写一个确认这些交互和约束的测试。 Mockito建议(通过this article by Mockito's original developer暗示)倾向于在测试通过之前添加存根,并且仅在存在昂贵或非幂等副作用的情况下添加验证/计数。