如何解决模拟在函数内部创建的外部依赖对象,而无需在C ++中注入依赖
我试图用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()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。