gpt4 book ai didi

c++ - 在 C++ 中模拟没有依赖注入(inject)的函数内部创建的外部依赖对象

转载 作者:行者123 更新时间:2023-12-01 14:57:02 26 4
gpt4 key购买 nike

我正在尝试用 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 进行依赖注入(inject),这将得到解决。通过构造函数或 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);

最佳答案

最简单的方法是使用依赖注入(inject)。我不认为有任何类似于 PowerMockito 的东西对于 C++(例如,不可能以与 PowerMockito 允许 java 类似的方式模拟静态方法/函数)。
如果问题仅在于通过 ctor 或 setter 方法进行依赖注入(inject),请考虑使用 hi-perf dependency injection ,即使用模板注入(inject)模拟。
如果 class A根本无法修改,但您拥有 class B ,考虑搬家class B到一个单独的静态库:一个用于生产(例如,libBprod)和一个用于测试(libBtest)。在生产中,您可以链接到 libBprod并在针对 libBtest 的测试中.在 libBtest , 你可以制作 class B引擎盖下的单例。这是相当多的工作。
如果两者都是 class Aclass B无法修改,那么我没有想法-您需要以某种方式重构代码的某些部分。

关于c++ - 在 C++ 中模拟没有依赖注入(inject)的函数内部创建的外部依赖对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63736336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com