【发布时间】:2018-12-30 14:41:50
【问题描述】:
依赖注入的好处之一是易于测试,因为可以注入模拟类。 Clazz 为此目的获取原始指针并将其移动到唯一指针,以表明它拥有 InjectedObj 对象:
Clazz::Clazz(InjectedObj *injectedObj) : injectedObjPtr(injectedObj) { }
injectedObjPtr 是成员:
std::unique_ptr<InjectedObj> injectedObjPtr;
doSth方法通过调用智能指针调用executeSth:
//doSth method
int CLazz::doSth() {
return injectedObjPtr->executeSth();
}
我想通过对注入对象设置一些期望来测试 Clazz, 所以我的测试看起来与此类似:
TEST_F(testFixture, exeuteTest)
{
//before
InjectedObj* injectedObj = new InjectedObj();
EXPECT_CALL(*injectedObj, executeSth())
.Times(1)
.WillOnce(Return(100));
//when
Clazz clazz(injectedObj);
//then
ASSERT_DOUBLE_EQ(clazz->doSth(), 100);
}
所以在这个简化的场景中,clazz->doSth() 正在调用应该返回 100 的 injectedObj->executeSth,但它的行为就像我永远不会设定我的期望并且总是得到 0。显然,如果我在没有智能指针的情况下调用我的模拟对象:@987654329 @ 它返回 100,但在使用 unique_ptr 调用它时不返回。当模拟对象由智能指针管理时,有什么方法可以告诉 gmock 设置正确的期望?谢谢
【问题讨论】:
-
我不太明白您要做什么:1.
Clazz::Clazz()采用原始指针并将其存储到std::unique_ptr<>; 2.std::shared_ptr<Clazz> clazz(injectedObj);直接将原始指针传递给std::shared_ptr<>。 -
是的,Clazz 使用原始指针来启用模拟依赖注入,并将其存储为它拥有的唯一指针。 2. 我还将 Clazz 作为 shared_ptr 来处理清理工作。所以基本上我不想对注入的模拟设定期望,它在 Clazz 构造函数中变成了 unique_ptr。
-
我也有同样的问题,问题指出要找到一种方法来测试/模拟对象的 shared_ptr。在我的情况下, shared_ptr 是 Clazz 的,它是 Claz 主要对象的模拟。为这个问题添加书签,我遇到了同样的问题。
-
Clazz中有operator->吗?它返回什么?