我有两个类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时,我想验证在消息处理过程中计时器是否正确启动/停止。
答案 0 :(得分:1)
您应该传递一个生成B的工厂,而不是传递B。它仍然保持依赖项注入。 工厂可以是虚拟类,函数指针,std :: function,...
然后由A决定使用工厂。您的测试只需验证A的建造过程中是否使用了工厂。
更新:您的工厂应该是抽象的,并将实例返回给A所需的B的公共接口。在测试过程中,可以对工厂进行编程以生成模拟的B实例。
还要确保在A的类定义中,首先声明传递给B的成员,然后声明拥有B实例的成员。这是为了使第一个成员的寿命超过B。