惩戒集成测试(Mocking for integration tests)

2019-07-28 22:52发布

一个人如何嘲笑需要集成测试的许多依赖?

我用了的Mockito我的“纯”的单元测试。 在这种情况下,“纯粹”的检测手段单一类,嘲讽它的所有依存关系。 美丽。

现在就来集成测试。 让我们在这种情况下,集成测试将测试是这样说的:

  1. 消息放在一个队列
  2. 消息“处理”
  3. 响应消息被放在一个响应队列

让我们也说,这种情况发生在步骤2中的处理是严肃的事情。 它依赖于大量的数据库交互,对多个外部服务,文件系统,各种各样的东西。 也有很多副作用,流量将触发,所以我不能简单地确保响应是正确的 - 我需要验证的副作用。

这些依赖关系中的每一个由一个无状态的服务类,这使他们很好的和mockable包裹。

如何乡亲处理呢?

我喜欢使用这样的Mockito我可以确认的副作用,上述流程都会有。 然而,Mocktio的文档(并在很大程度上它的实现)似乎在对抗比“纯”单元测试其他环境中使用它强烈对抗。 我试图走这条路线,但

  • 这是很难填充存根数据(有很多很多的)
  • 这是很难有春天注入的存根情况下进入我的豆子
  • 这是很难“重置”的嘲笑,这样我可以验证一组不同的相互作用不清除出来的存根。

编辑

我知道,我可以像一个HSQLDB实例处理数据库的问题,但仍然有对外服务的问题。 对于重复性我不能依靠这些服务是起来,在我需要时,状态等等。我看到有嘲笑他们唯一的选择之中。

Whatdaya呢?

Answer 1:

大的问题。

这似乎是你打的的Mockito的限制。 如果要检查的对象交互的Mockito什么是伟大的。

你想要什么,不过,似乎是在更高的抽象水平的可观测性(和可控性)。 恐怕你需要的是嘲笑或存根应精心设计和手工制作。

在单元级别,可以很好地产生这些嘲笑,通过的的Mockito手段。 在集成度,这变得更加困难,你需要特制的可测​​试性接口。



Answer 2:

为了嘲笑之类的数据库,Web服务,文件系统等,你可能会想重构一点。 对于每一个外部服务,你应该写有您要进行各项操作的方法的包装类。 每个这样的方法应该没有实际的逻辑,而只是通过其参数,外部服务将明白的方式,并返回包含任何数据的外部服务返回的对象。 例如,如果你与数据库交互,包装类可以设置其参数为一个SQL语句,将其提交到现有的Connection对象,并返回一个List的结果。

因为包装类的方法中不包含逻辑(即,没有的if / else,没有循环,也没有异常处理); 没有必要进行单元测试的包装类。 你应该集成测试的包装类,以确保它的责任是正确执行(即,在SQL语句的数据库所期望的效果,例如)。

现在重新写,使他们与包装类,而不是互动与外部服务交互的类。 它是那么容易进行单元测试他们 - 你只需要嘲笑包装类。



Answer 3:

如果有一些HTTP或其他模拟框架,使用应该不错。

所有复杂的依存关系可以被记录,修改和回放。



文章来源: Mocking for integration tests