- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个类 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/
我是一名优秀的程序员,十分优秀!