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

时间:2019-09-18 13:06:35

标签: c++ unit-testing testing dependency-injection

我有两个类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时,我想验证在消息处理过程中计时器是否正确启动/停止。

1 个答案:

答案 0 :(得分:1)

您应该传递一个生成B的工厂,而不是传递B。它仍然保持依赖项注入。 工厂可以是虚拟类,函数指针,std :: function,...

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

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

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