您永远不应该在另一个 class 方法中创建任何其他 class 的新对象吗?
Should you NEVER create a new object of any other class in another class' method?
我一直在努力理解依赖注入和 Ioc 以及所有与之相关的概念,但没有取得太大进展。
我所理解的是使我的 class(比如 A)可测试(我的 class 使用 class B 的对象),我应该将对象注入我的class' 构造函数是这样的:
class A{
B class_B_Object;
A(B class_B_Object){
this.class_B_Object = class_B_Object;
}
}
所以,我的问题是,可以肯定地说我的 class A 的任何方法中都不应该有类似 var classBObject = new B()
的东西吗?
never 是一个很强的词,你应该非常小心地使用它。根据 A
和 B
是什么,A
创建(通常是 return)B
的实例可能是完全正常的。这里可测试性的要点是,如果 A
使用 B
的一个实例并依赖于它的逻辑,你应该有一个简单的方法来注入模拟B
的实例,其中此逻辑受到控制(即 - 模拟),因此当您为 A
编写单元测试时,您只是在测试其逻辑,而不是 B
的底层逻辑.
使您的代码易于单独进行单元测试的第一步是在层之间使用弱耦合。这意味着你的 A
class 构造函数不应该采用 B
class 而是 IB
一些潜在的 B
class 可能的接口实行。这将允许您在单元测试中用您可以控制的东西替换此接口 - 一个模拟,因为您正在测试 A
class,而不是 B
.
关于你的var classBObject = new B()
问题,具体要视情况而定,但一般情况下,最好从外部提供这个实例。
我一直在努力理解依赖注入和 Ioc 以及所有与之相关的概念,但没有取得太大进展。
我所理解的是使我的 class(比如 A)可测试(我的 class 使用 class B 的对象),我应该将对象注入我的class' 构造函数是这样的:
class A{
B class_B_Object;
A(B class_B_Object){
this.class_B_Object = class_B_Object;
}
}
所以,我的问题是,可以肯定地说我的 class A 的任何方法中都不应该有类似 var classBObject = new B()
的东西吗?
never 是一个很强的词,你应该非常小心地使用它。根据 A
和 B
是什么,A
创建(通常是 return)B
的实例可能是完全正常的。这里可测试性的要点是,如果 A
使用 B
的一个实例并依赖于它的逻辑,你应该有一个简单的方法来注入模拟B
的实例,其中此逻辑受到控制(即 - 模拟),因此当您为 A
编写单元测试时,您只是在测试其逻辑,而不是 B
的底层逻辑.
使您的代码易于单独进行单元测试的第一步是在层之间使用弱耦合。这意味着你的 A
class 构造函数不应该采用 B
class 而是 IB
一些潜在的 B
class 可能的接口实行。这将允许您在单元测试中用您可以控制的东西替换此接口 - 一个模拟,因为您正在测试 A
class,而不是 B
.
关于你的var classBObject = new B()
问题,具体要视情况而定,但一般情况下,最好从外部提供这个实例。