gpt4 book ai didi

c++ - 如何将 GMock 与依赖注入(inject)一起使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:33 25 4
gpt4 key购买 nike

我有一个带有几个依赖项的类,我想使用 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
}

我还有一个依赖接口(interface),

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。不是这次谈话的主题......

最佳答案

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

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

// etc.
}

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

关于c++ - 如何将 GMock 与依赖注入(inject)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22295076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com