c++ - 在 C++ 中模拟没有依赖注入的函数内部创建的外部依赖对象
问题描述
我正在尝试用 C++ 编写单元测试,并且面临使用 Fakeit 为外部依赖项创建模拟对象的问题。所以我们有一个类似于下面的类:
class A
{
int test_method()
{
B obj;
return obj.sendInt()
}
};
class B
{
int sendInt()
{
return 5;
}
};
现在假设我想为test_method()
class编写一个单元测试A
。当我们打电话时,obj.sendInt()
我想模拟它并返回一个不同的值。我尝试使用 fakeit 但无法找到解决方案。
我知道如果我们尝试B
通过构造函数或 setter 方法进行依赖注入,这将得到解决,但我不想这样做,因为它需要对A
.
对于 Java 中的类似场景,我会使用 PowerMockito 并使用PowerMockito.whenNew
B mock = Mockito.mock(B.class);
PowerMockito.whenNew(B.class).withAnyArguments().thenReturn(mock);
Mockito.when(mock.test()).thenReturn(2);
A obj=new A();
assertEquals(obj.test(), 2);
解决方案
最简单的方法是使用依赖注入。我不认为有任何与PowerMockito
C++ 类似的东西(例如,不可能以类似于PowerMockito
允许 java 的方式模拟静态方法/函数)。
如果问题仅在于通过 ctor 或 setter 方法进行依赖注入,请考虑使用高性能依赖注入,即使用模板注入模拟。
如果class A
根本无法修改,但您拥有class B
,请考虑移至class B
单独的静态库:一个用于生产(例如libBprod
),一个用于测试(libBtest
)。在生产中,您可以链接到libBprod
和在测试中针对libBtest
. 在libBtest
中,您可以class B
在引擎盖下创建一个单例。这是相当多的工作。
如果两者class A
都class B
不能修改,那么我没有想法 - 你需要以某种方式重构代码的某些部分。
推荐阅读
- handlebars.js - 在哪里可以找到使用车把在 Ghost 中绑定的一些数据?
- awk - 使用 find 按比 X 天新的文件计算总已用磁盘空间 TB
- docker - 如何加快在 EC2 上构建 docker 映像
- python - 有没有办法让列表包含所有索引
- java - 将 ThreadPoolBulkhead 与 Timelimiter 和 Retry 一起使用时出现问题
- css - React Material Card 中的图标按钮
- javascript - 可以使用`onclick`功能制作登录页面吗?
- reactjs - 在 redux 商店中保持表单状态是最佳实践吗?
- php - pdfparser 说:“目前不支持受保护的 pdf 文件。”
- visual-studio-code - Visual Studio 代码调用层次结构