如何在不修改生产代码的情况下破坏依赖性?

时间:2009-06-17 14:49:04

标签: asp.net sql vb.net unit-testing

从我最初的单元测试读数(我是初学者)开始,将所有设置和测试放在与被测试代码不同的项目中是明智的。这对我来说似乎也很理想。但是,我最近开始阅读单元测试的艺术,试图发现如何打破对数据库调用等事物的依赖。提供的方法涉及更改测试代码的区域,例如向生产代码添加特定接口和“存根”方法。这似乎打败了一些关于保持测试和生产代码分离的好处。

是否有任何推荐的依赖性破坏技术不涉及更改生产代码?

3 个答案:

答案 0 :(得分:4)

没有做出某种改变就无法打破依赖关系。重要的是,您所做的更改不会改变生产中生产代码的行为,也不会引入更糟糕的依赖关系。

答案 1 :(得分:3)

根据定义,需要在生产代码中破坏依赖关系以使其更易于测试,即,为了使生产代码更易于测试,您需要更改代码以使其更少地与实际实现耦合。这将允许您在测试中将模拟对象替换为测试中的类中的真实对象。这消除了对被测试类所依赖的其他生产类的依赖。

如果你编写了松散耦合的生产代码 - 依赖于接口而不是实现的代码,它使用工厂和依赖注入来创建对象而不是直接实例化 - 那么你可能只需要进行小的更改或者不需要完全符合您的生产代码。如果没有,那么您将需要进行这些类型的更改。然而,这并不是一件坏事,因为它会通过减少类之间的耦合来改善您的设计。这样做的成本将是一些额外的(小)类和/或接口,使隔离成为可能。

如果您使用TDD(测试驱动开发/设计),您在生产代码中使用的构造类型将会更改,以使其更加自然可测试。这是TDD改进设计以及将测试结合到代码中的方法之一。

请注意,您不需要在生产代码中将耦合或依赖项引入测试代码。您的测试代码显然将依赖于生产,您可能需要重构生产中的依赖项以使其更易于测试,但如果您的生产代码“知道”有关它如何被测试的任何信息,那么您可能做错了什么。当你应该使用依赖注入时,你可能已经引入了人工接口。

答案 2 :(得分:0)

我们使用Spring和工厂来破坏依赖关系。使用Spring的依赖注入,从开发和测试到生产只是一个不同的XML文件。