你如何测试依赖注入?

时间:2011-08-06 15:46:50

标签: unit-testing dependency-injection

依赖注入有助于您很好地对代码进行单元测试。但是我们如何测试是否在运行时最终注入了正确的依赖项?例如,我有一个服务类,它接收服务验证器列表。由于验证器列表是由DI容器注入的,我们如何确保注入正确的验证器?如果某些开发人员错误地从列表中删除了验证器,该怎么办?即使我们在依赖注入中编写测试,我们也不能在不破坏封装的情况下断言所有依赖关系。唯一的方法是集成测试,它对服务的验证行为进行断言。如果服务行为很复杂,那么编写集成测试就变得很困难。有任何想法吗 ??

1 个答案:

答案 0 :(得分:6)

用你的问题来解释:

我已经测试了我的应用程序的各个组件,但它们都有效,但我怎么知道整个应用程序的工作原理?

好消息

考虑一下你所处的位置有多好,而不是要问:

我现在已经编写了所有这些代码,我怎么知道应用程序是否有效?

您在单元测试中发现并删除了错误。依赖注入样式的编码使依赖关系变得清晰,并消除了对全局变量的依赖。这些技术本身意味着您可以减少错误,特别是在整个应用程序放在一起时只显示自己的错误。

测试更大

现在,继续回答您的问题,您可以编写一个自动化测试来断言您的依赖注入容器返回了一个特定的验证器。更好的是,我赞成写测试: -

  • 向DI容器询问一个对象(后面是一个协作对象图,例如验证器列表)
  • 让对象执行它的功能(验证此数据)
  • 断言结果(例如验证错误)

您可能希望使用test double替换访问数据库的某些对象,当前服务器时间,Web服务等。这很简单,因为您正在使用依赖注入。

除非一个课程特别麻烦,否则我更愿意在这个级别进行测试,因为它允许更多测试在重构中存活。如果作为较大测试的一部分进行练习,则圈复杂度为1的类不需要独立测试。具有较高圈复杂度的类可能。

大量测试,但有效吗?

即便如此,你可能也在想,但整件事情是否有效?

要最终回答这个问题,您需要以最终形式测试应用程序。对于Web应用程序,这意味着将其部署在具有适当数据库和真实防火墙等的适当服务器上。然后,您可以使用Selenium等手动测试或测试。

注入正确依赖项的失败将导致注入组件要执行的任何功能的灾难性错误。没有必要测试每个组合,但轻轻触摸每个组件。