首页 > 解决方案 > 在 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);

标签: c++unit-testinggooglemockcatch2fakeit

解决方案


最简单的方法是使用依赖注入。我不认为有任何与PowerMockitoC++ 类似的东西(例如,不可能以类似于PowerMockito允许 java 的方式模拟静态方法/函数)。

如果问题仅在于通过 ctor 或 setter 方法进行依赖注入,请考虑使用高性能依赖注入,即使用模板注入模拟。

如果class A根本无法修改,但您拥有class B,请考虑移至class B单独的静态库:一个用于生产(例如libBprod),一个用于测试(libBtest)。在生产中,您可以链接到libBprod和在测试中针对libBtest. 在libBtest中,您可以class B在引擎盖下创建一个单例。这是相当多的工作。

如果两者class Aclass B不能修改,那么我没有想法 - 你需要以某种方式重构代码的某些部分。


推荐阅读