我有一个带有几个依赖项的类,我想使用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。不是这次谈话的主题......
答案 0 :(得分:2)
您可以通过确保您的类成员是引用来使用依赖注入和引用:
template<typename TDep>
class SUT {
private:
TDep& dependency; // Reference
// etc.
}
请注意,您不再需要MockDependency
上的复制构造函数。通常,您需要访问SUT使用的所有模拟对象实例来设置它们的期望。