![](/img/trans.png)
[英]Dependency injection of class with variadic template member function
[英]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.