【发布时间】:2012-04-25 06:43:15
【问题描述】:
如何模拟集成测试所需的众多依赖项?
我使用 Mockito 进行“纯”单元测试。在这种情况下,“纯”意味着测试单个类,模拟它的所有依赖项。漂亮。
现在进行集成测试。假设在这种情况下,集成测试将测试如下内容:
- 消息被放入队列
- 消息已“处理”
- 响应消息被放入响应队列
我们还可以说,第 2 步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多个外部服务、文件系统以及各种各样的东西。流程还会触发很多副作用,所以我不能简单地确保响应正确 - 我需要验证副作用。
这些依赖项中的每一个都由单个无状态服务类包装,这使它们变得美观且可模拟。
人们是如何处理这个问题的?
我很想使用 Mockito 来验证上述流程的副作用。然而,Mocktio 的文档(在很大程度上是它的实现)似乎强烈反对在“纯”单元测试以外的上下文中使用它。我试过走这条路,但是
- 很难填充存根数据(因为它有很多)
- 很难让 Spring 将这些存根实例注入到我的 bean 中
- 很难“重置”模拟,这样我就可以在不清除存根的情况下验证一组不同的交互。
编辑
我知道我可以使用 HSQLDB 实例之类的东西来处理数据库问题,但仍然存在外部服务的问题。为了可重复性,我不能依赖这些服务处于启动状态、处于我需要的状态等。我看到的唯一选择是模拟它们。
做什么?
【问题讨论】:
-
只是为了澄清,因为集成测试可以通过两种方式进行。听起来您的意思是集成测试,即测试连接的组件是否可以很好地协同工作(本质上是测试 API)。但是,有时集成是指端到端的,因此您不会模拟您的服务并实际上允许它访问数据库。这种澄清可以帮助回答..请参阅stackoverflow.com/questions/4904096/…以进一步澄清类型
-
它确实适用于任何需要大量外部依赖的测试(集成或端到端)。例如,我可以用 HSQLDB 实例替换我的数据库存根,但我仍然拥有所有其他服务。将稍微编辑问题以澄清..
-
那么你最终是如何解决模拟问题的?
标签: mocking integration-testing mockito