【发布时间】: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&),即没有模拟对象的复制构造函数。我发现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& dependency; -
@RA.这确实完全解决了我的问题。如果您将其放在答案中,我会将其标记为已接受。非常感谢! =)
标签: c++ unit-testing googletest googlemock