【发布时间】:2020-01-19 10:56:20
【问题描述】:
我有两个类 A 和 B。目前,B 是在 A 内部构造的。由于我想在单元测试中验证 A 是否正确调用 B 的方法,所以我想将 B 注入 A而是启用模拟。
问题是:在构造时,B 需要 A 的字段之一作为构造函数参数。这意味着如果我注入 B 并因此将其构造移出 A,我还必须将该字段的构造移出 A。
这里最优雅的解决方案是什么?我希望我正确地解释了这个问题。如果没有,请随时提出任何问题。
尝试用代码 sn-ps 解释问题:
现在是什么样子:
// 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:从我的一个 cmets 内部澄清:
是的,所以目前 B 拥有各种计时器和与计时器相关的方法。它的方法在消息处理期间由 A 调用。 B 需要访问位于 A 内部的队列和一些其他资源。在测试 A 时,我想验证在消息处理期间计时器是否正确启动/停止。
【问题讨论】:
-
您对终身管理的偏好做得很好!也许也可以尝试在 Rust 中编译?
-
我不明白是什么让你想到 Rust tbh :'D
-
好吧,既然 Rust 对生命周期管理更加谨慎,那么在 Rust 中工作的任何东西都应该适合 C++。如果我没记错的话,你想要避免的一些解决方案确实会给 Rust 编译器带来麻烦,这应该证明你的观点。
-
哦,我明白了,我不知道 :) 感谢您的澄清!
标签: c++ unit-testing testing dependency-injection