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

标签 c++ unit-testing testing dependency-injection

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

相关文章:

java - 使用 Autowiring 组件为 Spring Boot 服务应用程序编写 JUnit 测试用例

angularjs - 在测试中模拟 $routeParams 以动态更改其属性

c++ - 测试 C++ 应用程序的性能

java - 无法使用 robolectric 捕获 HTTP 请求

c++ - 一种通过 ID 访问并查找加权随机项的高效数据结构

c++ - C 编程中 fscanf() 的问题

ruby-on-rails - 使用 RSpec 测试 Rails Controller ——如何测试 : current_account. 项目

javascript - Protractor 的等价物被显示

c++ - 为什么通过指针静态访问类数据成员返回1?

c++多个智能指针分配导致崩溃