繁体   English   中英

依赖注入:依赖需求字段/成员

[英]Dependency Injection: Dependency needs field/member

我有两个类A和B。目前,B是在A内部构造的。由于我想在单元测试中验证A正确调用B的方法,因此我想将B注入A而不是启用模拟。

问题是:在构造时, B需要A的字段之一作为构造函数参数。 这意味着,如果我注入B并因此将其构造从A移出,那么我也必须将该字段的构造从A移出。

这里最优雅的解决方案是什么? 我希望我能正确解释这个问题。 如果没有,请随时提出任何问题。

尝试解释代码片段的问题:

目前的状况:

// constructor of class A. b_ is being constructed. field_of_a_ is initialized.
A::A() : b_{field_of_a_}, field_of_a_{5} {

}

我要避免的是:

// In the class constructing A...
int field_of_a;
B b(field_of_a);
A a(b, field_of_a);

// and inside A...
A::A(B& b, int& field_of_a) : b_{b}, field_of_a_{field_of_a} {

}

编辑1:从我的评论之一中澄清:

是的,因此B目前拥有各种计时器和与计时器相关的方法。 在消息处理期间,A调用其方法。 B需要访问队列和位于A内部的其他一些资源。在测试A时,我想验证消息处理期间计时器是否正确启动/停止。

除了传递B之外,还应该传递一个生成B的工厂。它仍然保持依赖项注入。 工厂可以是一个虚拟类,一个函数指针,一个std :: function等。

然后由A决定使用工厂。 您的测试只需验证在A的制造过程中是否使用了工厂。

更新:您的工厂应该是抽象的,并将实例返回到A所需的B的公共接口。 在测试过程中,可以对工厂进行编程以生成模拟的B实例。

另外,请确保在A的类定义中,首先声明传递给B的成员,然后声明拥有B实例的成员。 这是为了使第一个成员的寿命超过B。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM