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

标签 java junit mocking mockito

假设我必须在 ClassA 上编写一些测试有一个ClassB作为成员(member),我在 mock ClassB .

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

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

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

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

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

最佳答案

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

代码片段,由 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/

相关文章:

java - Eclipse+Junit4+SpringFramework : Running an individual Unittest class caused "Failed to load ApplicationContext" Exception

java - 如何使用 arg 'T value' 模拟方法?

java - struts 中的 JSON 响应

java - 通过 DataOutputStream.writeUTF() 发送信息时出现奇怪的字符

java - Android 手机在最大音量时保持静音

java - 设置 Jmeter 和 Junit 的测试数据

java - JUnits 4 运行时没有任何类级别注释?我在这里缺少什么?

java - Android SecondDialogFragment 未从 DialogFragment 显示

php - 尝试模拟 PHPUnit 中的依赖项时出现“无法重新声明类”错误

ruby-on-rails - 如何在 RSpec 中将测试与外部服务依赖项隔离