问题描述
我试图用C ++编写单元测试,并且遇到了使用Fakeit为外部依赖项创建模拟对象的问题。因此,我们有一个类似于以下内容的类:
class A
{
int test_method()
{
B obj;
return obj.sendInt()
}
};
class B
{
int sendInt()
{
return 5;
}
};
现在让我们说我想为类test_method()
的{{1}}编写单元测试。当我们调用A
时,我想模拟它并返回一个不同的值。我尝试使用fakeit,但无法找到解决方案。
我知道,如果我们尝试通过构造函数或setter方法进行obj.sendInt()
的依赖项注入将解决,但是我不想这样做,因为它会在{的现有使用者中进行一些重构{1}}。
对于Java中的类似情况,我将使用powermockito并使用B
A
解决方法
最简单的方法是使用依赖注入。我认为C ++没有类似于PowerMockito
的东西(例如,不可能像PowerMockito
允许Java那样模拟静态方法/函数)。
如果问题仅在于通过ctor或setter方法进行依赖项注入,请考虑使用hi-perf dependency injection,即使用模板注入模拟。
如果class A
根本无法修改,但您拥有class B
,请考虑将class B
移至单独的静态库:一个用于生产的库(例如libBprod
)一个用于测试(libBtest
)。在生产中,您可以链接到libBprod
,在测试中可以链接到libBtest
。在libBtest
中,您可以将class B
设为单例。不过,这是很多工作。
如果class A
和class B
都无法修改,那么我就没主意了-您需要以某种方式重构部分代码。
我将初始化B的代码移动到了私有方法,并使用gmock模拟了该私有方法
def collatz_s(num):
while num != 1:
if num in even:
result = num // 2
print(result)
num = result
elif num in odd:
result = num * 3 + 1
print(result)
num = result
num = int(input('choose a random number'))
collatz_s(num)
# input 5
# output
16
8
4
2
1
我的测试方法看起来像
class A
{
int test_method()
{
return getBValue();
}
int getBValue()
{
B obj;
return obj.sendInt()
}
}