unit-testing - 由于编写可测试代码而导致工厂过多

标签 unit-testing design-patterns

我正在尝试编写易于测试的代码。这导致我避免直接​​调用 new Class1() 。相反,我通常创建一个接口(interface),一个简单的工厂,其中包含一个返回该接口(interface)的 GetObject() 方法。

效果很好。我发现的问题是太多的工厂除了调用 new Class1() (或它们负责创建的任何类/接口(interface))之外基本上没有任何作用。我认为拥有可测试代码并不是一个很大的代价,但仍然...是否有人使用更好的方法并且仍然实现能够在测试时注入(inject) Class1 的不同实现的目标?

我知道我可以将 Class1 实现公开为属性并在运行时使用默认值,但这意味着我仅限于一个实例,而在许多情况下,我希望每次需要 Class1 时都创建一个新实例。

编辑:
我确实使用 IoC,这确实有帮助。尽管如此,我通常最终会在 IoC 配置中将工厂作为依赖项。我的 GetObject 方法通常调用 IoC.Resolve 之类的方法。我更喜欢将 IoC 依赖项隔离在工厂中,而不是直接隔离在包含业务逻辑的域类中。

最佳答案

有许多框架可以帮助实现这一目标。该技术称为控制反转。 .NET 世界中的示例:

所有这些框架的共同点是能够将组件(类)之间的绑定(bind)外部化为配置,该配置要么表示为配置文件(即 XML 中),要么表示为“引导”代码。它们能够自动将依赖项注入(inject)到实例中,并为您解决类实例化和配置的问题。基本上,您可以将此任务留给 IoC 容器并停止创建自定义工厂类。

SO 上的相关资源标记为 ioc-container .

Martin Fowler 有一个 article描述 IoC 和实现技术,例如依赖注入(inject)和服务定位器。

关于unit-testing - 由于编写可测试代码而导致工厂过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4538070/

相关文章:

multithreading - Parallel.ForEach 已过时。老了,过时了?

node.js - 模拟 Node.js 中测试的特定读取文件错误

php - 如何使用 Mockery 模拟构造函数

objective-c - Xcode 6.4 Swift 单元测试无法编译 : "GPUImage.h not found" "failed to import bridging header"

javascript - 构建真实世界的 AngularJS 应用程序,我应该如何在 html 中声明我的 Controller 。我需要在index.html中声明所有内容吗?

java - 与第三方库解耦的设计模式

Angular - 为什么我的弹珠测试不适用于包含用户权限的BehaviorSubject?

angular - 如何在 Angular 中测试延迟加载路由的存在?

objective-c - 标准委托(delegate)模式似乎与委托(delegate)目的不一致

java - 解释器模式和访问者模式有什么区别?