【问题标题】:How do I use GMock with dependency injection?如何将 GMock 与依赖注入一起使用?
【发布时间】:2014-03-10 08:16:12
【问题描述】:

我有一个带有几个依赖项的类,我想使用 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&amp;),即没有模拟对象的复制构造函数。我发现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。不是本次谈话的主题...

【问题讨论】:

  • @IngeHenriksen:我读过这个问题,但它并没有解决我的问题,因为我通过引用而不是指针注入。调用模拟对象的复制构造函数时不会复制期望值,我宁愿不更改它,因为它会破坏接口。
  • @TomasLycken 为什么不将SUT 中的私有成员作为参考?即TDep&amp; dependency;
  • @RA.这确实完全解决了我的问题。如果您将其放在答案中,我会将其标记为已接受。非常感谢! =)

标签: c++ unit-testing googletest googlemock


【解决方案1】:

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

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

    // etc.
}

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

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多