gpt4 book ai didi

c++ - 依赖注入(inject) : Dependency needs field/member

转载 作者:行者123 更新时间:2023-11-28 04:10:11 25 4
gpt4 key购买 nike

我有两个类 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/

25 4 0
文章推荐: c++ - 使用带有 PIR 传感器的毫秒检测连续运动
文章推荐: c++ - C++ 指针的新手;试图从指向父类的指针 vector 中检索子对象。帮助将不胜感激
文章推荐: jquery - 使用 CSS 设置 以占用 的整个宽度