我有两个类 A 和 B。目前,B 是在 A 内部构造的。由于我想在我的单元测试中验证 A 是否正确调用 B 的方法,所以我想将 B 注入(inject) A而是启用模拟。
问题是:在构造时,B 需要 A 的字段之一 作为构造函数参数。这意味着如果我注入(inject) 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。它仍然保持依赖注入(inject)。 工厂可以是虚拟类、函数指针、std::function、...
然后由 A 使用工厂。您的测试将简单地验证在构造 A 期间是否使用了该工厂。
更新:您的工厂应该是抽象的,并向 A 需要的 B 的公共(public)接口(interface)返回一个实例。在测试期间,可以对工厂进行编程以生成 B 的模拟实例。
此外,确保在 A 的类定义中首先声明传递给 B 的成员,然后是持有 B 实例的成员。这是为了让第一个成员的生命周期比 B 长。
关于c++ - 依赖注入(inject) : Dependency needs field/member,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57993524/