Oop 将接口对象传递给构造函数或方法
我正在写一个测试,我必须通过一个模拟到一个特定的方法。我想知道,通过构造函数或直接将其传递到所讨论的方法中有什么好处吗。或者这并不重要 比如说 通过构造函数传递接口/mockOop 将接口对象传递给构造函数或方法,oop,testing,mocking,Oop,Testing,Mocking,我正在写一个测试,我必须通过一个模拟到一个特定的方法。我想知道,通过构造函数或直接将其传递到所讨论的方法中有什么好处吗。或者这并不重要 比如说 通过构造函数传递接口/mock class User() { IClock clock; User(IClock clock) {this.clock = clock;} User GetUser(){ ..} UpdateUser(User user) { ... this.clock.Now();
class User()
{
IClock clock;
User(IClock clock) {this.clock = clock;}
User GetUser(){ ..}
UpdateUser(User user) {
...
this.clock.Now();
...
}
}
vs
将接口/模拟传递到方法中
class User()
{
User GetUser(){ ..}
UpdateUser(IClock clock, User user) {
...
clock.Now();
...
}
}
谢谢
编辑
在这种情况下,IClock将是包装DateTime。我这样做是为了可测试性。因此,有效地,我将有一个覆盖,它将在自身内部构造IClock
例如,对于方法案例:
UpdateUser(User user) {
UpdateUser(new Clock(), user);
}
时钟将封装日期时间。这取决于谁知道
IClock
:它在构建用户
的地方可用,还是在调用更新用户
的地方可用
如果将其传递给构造函数,则可以传递User
对象,任何人都可以调用UpdateUser
,但如果通过UpdateUser
,则使用该方法的任何人都必须持有IClock
引用。将依赖项(即IClock
)传递给构造函数,也就是说,构造函数注入通常意味着这是给定类的整个对象所必需的依赖关系。将依赖项传递给类的方法,即方法注入,只会使这个特定的方法依赖于它。还有另外两种可能性:将依赖项注入属性(属性注入,即类的对象的可选依赖项)和很少使用的环境上下文
所以,这更多的是关于团队中代码风格的品味、设计和一致性的问题
在您的示例中,
IClock
用户的对象不需要依赖项,因此方法注入更合适。在这种情况下,IClock是一个隐藏的单例-它从底层操作系统生成当前日期时间。如果您想编写可靠的验收测试,您需要在这些测试中删除日期时间提供程序
因此,您需要将此依赖关系一直公开到模块边界,然后将公共日期时间源注入到您的模块(甚至整个系统)。在编写验收测试时,您有时会存根这个“IClock”日期时间源
这将允许您回答以下问题:
- 我的系统在闰日工作吗
- 我的系统在午夜工作吗
- 我的系统在除夕有效吗
- 这种方法的责任是否一定需要知道日期和时间
- 或者它与这个特定对象中方法的特定实现有关,这意味着它需要日期时间李>
- 方法的调用方负责处理该对象的日期时间视图是否合理,或者这是模块配置的责任
- 如果我将此对象与同一接口的另一个实现交换,那么该实现不需要此方法的日期时间是否合理
- 对象中有多少方法需要日期时间?他们需要相同的日期时间视图吗