如何测试依赖注入?

13

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


3
我认为集成测试是正确的答案,但你说得对,有些东西可能很难测试。 - Kevin
2
一些依赖注入框架(如果不是大多数)允许您让容器验证所有注册并测试是否可以创建每个注册。如果可以的话,请在应用程序启动时触发此验证。这可以防止应用程序在无法创建所有依赖项时启动,并且以这种方式运行(或调试)应用程序时立即找出DI配置错误。 - Steven
@Steven Hibernate有这样的验证工具吗? - mauryat
@user640378 我不知道。 - Steven
1个回答

9
为了简化你的问题:
我已经测试了应用程序的各个组件,它们都能正常工作,但是我如何知道整个应用程序是否可以正常工作?
好消息
考虑一下你现在的处境有多么好,与此相比,你可能会问:
我已经编写了所有这些代码,但我如何知道应用程序是否可以正常工作?
你找到并删除了单元测试中的错误。采用依赖注入风格的编码使依赖关系清晰,消除了对全局变量的依赖。这些技术本身就意味着你将拥有更少的错误,特别是那些只在整个应用程序放在一起时才显示自己的错误。
更大范围的测试
现在,为了回答你的问题,你可以编写一个自动化测试来断言你的依赖注入容器返回了一个特定的验证器。更好的方法是,我更喜欢编写这样的测试: -
- 请求 DI 容器中的对象(背后是一组协作对象的图表,例如验证器列表) - 要求对象执行其功能(验证这些数据) - 断言结果(例如验证错误)
您可能需要使用测试替身替换某些访问数据库、当前服务器时间、Web 服务等的对象。这很容易,因为你正在使用依赖注入。
除非一个类特别麻烦,否则我更喜欢在这个级别上进行测试,因为它允许更多的测试在重构时生存下来。如果一个类的圆形复杂度为 1,如果作为较大测试的一部分运行,则不需要单独测试。圆形复杂度较高的类可能需要。
许多测试,但它是否有效?
即使如此,你可能会问:但是整个应用程序是否可以正常工作?
要最终回答这个问题,你需要测试应用程序的最终形式。对于 Web 应用程序,这意味着将其部署在一个真正的服务器上,具有真正的数据库和真正的防火墙等。然后你可以手动测试或使用 Selenium 测试。
注入正确的依赖关系失败将导致注入组件所需的任何功能出现灾难性错误。不必测试每个组合,但轻触每个组件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接