向类中添加更多依赖项听起来像是太多工作

时间:2011-03-01 14:37:06

标签: dependency-injection tdd

我是依赖注入的新手。我有点困惑希望有人可以帮助我...

假设我们有一个A类,它有一个通过构造函数注入的依赖项(接口IB)。假设我已经写了几十个为A类编写的测试用例,现在在后一阶段我发现我需要一个A类依赖(比如接口IC)。这是否意味着我必须修改我的构造函数和所有测试用例?因为我将在测试用例中为A类创建对象。

编辑:还必须修改所有测试用例,这增加了我们在测试用例中出现错误的可能性。

3 个答案:

答案 0 :(得分:8)

不是问题;这是测试的问题。更具体地说,你患有Fragile Test气味。

可以使用SUT Factory来解决此问题,而不是使用new关键字直接创建SUT。这将允许您在将来更改构造函数签名而不会破坏大量测试。

答案 1 :(得分:5)

这是一个很好的问题。我认为它有两个部分 - 实际需要改变构造函数的签名和引入新依赖的行为。

向构造函数添加新参数不应过于繁琐,尤其要考虑当前IDE中的重构工具(例如Eclipse中的Change Method Signature),它将添加参数并更改调用此构造函数的所有位置。

另一方面,在我看来,引入新的依赖性始终是重构的机会。如果你的A级无法在没有新的依赖性的情况下完成其功能,那么它就会开始承担太多的责任。

可以帮助您在许多地方克服在测试中更改代码创建代码的需求的一个技巧是使用专用工厂来处理准备好进行测试的状态中的对象实例的准备工作。您不必在生产中使用工厂(DI容器完全相同),但在测试代码中它可能会变得方便。

答案 2 :(得分:1)

是的,您可以更改构造函数和测试。如果你发现世界是圆的,你就不会继续测试它的平整度,对吗? :-)使用适当的存根,额外的工作将不会那么难。我一直这样做。它是TDD的核心。

此致 的Morten