2009-06-17 73 views
1

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

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

+1

首先编写代码(例如使用依赖注入方法)。如果你首先对依赖关系进行硬编码,那么在没有代码修改的情况下,没有好的办法可以将它们删除,只有肮脏的黑客。测试将保持独立,但生产代码必须可测试! - ) – 2009-06-17 14:52:54

回答

4

如果不进行某种更改,就无法打破依赖关系。重要的是,您所做的更改不会改变生产中生产代码的行为,并且不会引入更差的依赖关系。

3

根据定义,需要在生产代码中打破依赖关系,以使其更具可测性,即为了使生产代码更具可测试性,您需要更改代码以使其与实际实现的耦合程度降低。这将允许您在测试中用模拟对象替换待测试类中的实际对象。这消除了被测试类所依赖的其他生产类的依赖性。

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

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

请注意,您不应该将生产代码中的耦合或依赖项引入到测试代码中。您的测试代码显然将依赖于生产,您可能需要重构生产中的依赖关系以使其更易于测试,但是如果您的生产代码“知道”关于它如何进行测试的任何内容,那么您可能做了错误的事情。当您应该使用依赖注入时,您可能已经引入了人造界面。

0

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

相关问题