如何使用依赖注入GMock?

时间:2014-03-10 08:16:12

标签: c++ unit-testing googletest googlemock

我有一个带有几个依赖项的类,我想使用Google Mocks进行模拟,以便使用Google Test测试该类。

简化,我有以下 1

template<typename TDep>
class SUT {
private:
    TDep dependency;

public:
    explicit SUT(const TDep& dep) : dependency(dep) { }
    SUT(const SUT& other) : dependency(dep.other) { }

    // some methods that use the dependency
}

我还有一个依赖的接口,

class IDependency {
public:
    virtual double calculateCoolStuff(double) const = 0;
    virtual ~IDependency() { };
}

和模拟对象

class MockDependency {
public:
    MOCK_CONST_METHOD1(calculateCoolStuff, double(double));
};

然而,当我尝试编译类似

的东西时
MockDependency mock;
SUT sut(mock);

我收到错误声明error: use of deleted function MockDependency(const MockDependency&),即没有模拟对象的复制构造函数。我发现this discussion on Google Groups基本上以使模拟对象不可复制为止,但允许用户添加复制构造函数并手动定义复制行为。非常好:

class MockDependency {
public:
    MockDependency(const MockDependency& other) { }
    MOCK_CONST_METHOD1(calculateCoolStuff, double(double));
};

现在我的代码编译了,但如果我运行类似

的东西
MockDependency mock;
SUT sut(mock);

EXPECT_CALL(mock, calculateCoolStuff(2.0)).WillRepeatedly(Return(3.0));

sut.doStuff(); // Calls calculateCoolStuff

在测试中,我收到一条错误,指出呼叫从未设置过。换句话说,我可用于设置期望的实例mock不再与用于计算的SUT上的实例相同。这使得使用GMock和DI进行测试变得困难,至少可以说......

最佳解决方案是什么?


1 )是的,我正在使用穷人的DI。不是这次谈话的主题......

1 个答案:

答案 0 :(得分:2)

您可以通过确保您的类成员是引用来使用依赖注入和引用:

template<typename TDep>
class SUT {
private:
    TDep& dependency;  // Reference

    // etc.
}

请注意,您不再需要MockDependency上的复制构造函数。通常,您需要访问SUT使用的所有模拟对象实例来设置它们的期望。