gpt4 book ai didi

c++11 - 在 unique_ptr 上 GMOCK EXPECT_CALL

转载 作者:行者123 更新时间:2023-12-04 11:15:30 25 4
gpt4 key购买 nike

依赖注入(inject)的好处之一是易于测试,因为可以注入(inject)模拟类。为此,Clazz 使用原始指针并将其移动到唯一指针,以表示它拥有 InjectedObj 对象:

Clazz::Clazz(InjectedObj *injectedObj)  : injectedObjPtr(injectedObj) { }

哪里 injectedObjPtr是成员(member):
std::unique_ptr<InjectedObj> injectedObjPtr;

doSth 方法通过调用智能指针来调用 executeSth:
//doSth method
int CLazz::doSth() {
return injectedObjPtr->executeSth();
}

我想通过对注入(inject)的对象设置一些期望来测试 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()正在拨打 injectedObj->executeSth它应该返回 100,但它的行为就像我永远不会设置我的期望并且总是得到 0。显然,如果我将在没有智能指针的情况下调用我的模拟对象: injectedObj->executeSth它返回 100,但在使用 unique_ptr 调用时不会返回。当模拟对象由智能指针管理时,有没有办法告诉 gmock 设置正确的期望?谢谢

最佳答案

鉴于:

struct InjectedObj {
MOCK_METHOD0(executeSth, int());
};

struct Clazz {
Clazz(InjectedObj* injectedObj)
: injectedObjPtr(injectedObj) {}

int doSth() {
return injectedObjPtr->executeSth();
}

std::unique_ptr<InjectedObj> injectedObjPtr;
};

TEST(testFixture, exeuteTest) {
// before
InjectedObj* injectedObj = new InjectedObj();
EXPECT_CALL(*injectedObj, executeSth()).Times(1).WillOnce(testing::Return(100));

// when
Clazz clazz(injectedObj);

// then
ASSERT_DOUBLE_EQ(clazz.doSth(), 100);
}
我有:
[----------] 1 test from testFixture
[ RUN ] testFixture.exeuteTest
[ OK ] testFixture.exeuteTest (0 ms)
[----------] 1 test from testFixture (0 ms total)
我敢打赌:你忘了标记 executeSthInjectedObj 的基类中 virtual方法。这样,gmock 生成了 gmock_executeSth您设置了期望的方法,但在测试中 executeSth来自基类(没有动态调度)被使用,因此测试失败。
// Example, bad
// THE executeSth METHOD SHALL BE MARKED WITH virtual!!!!!
struct InjectedObj {
virtual ~InjectedObj() = default;
int executeSth() {
return 0;
}
};

struct InjectedObjMock : public InjectedObj {
MOCK_METHOD0(executeSth, int());
};

struct Clazz {
Clazz(InjectedObj* injectedObj)
: injectedObjPtr(injectedObj) {}

int doSth() {
return injectedObjPtr->executeSth();
}

std::unique_ptr<InjectedObj> injectedObjPtr;
};

TEST(testFixture, exeuteTest) {
// before
InjectedObjMock* injectedObj = new InjectedObjMock();
EXPECT_CALL(*injectedObj, executeSth()).Times(1).WillOnce(testing::Return(100));

// when
Clazz clazz(injectedObj);

// then
ASSERT_DOUBLE_EQ(clazz.doSth(), 100);
}
输出:
[ RUN      ] testFixture.exeuteTest
/home/dchrzanowski/gitrepos/priv/gtestgmock/so.cpp:41: Failure
Expected: clazz.doSth()
Which is: 0
To be equal to: 100
/home/dchrzanowski/gitrepos/priv/gtestgmock/so.cpp:35: Failure
Actual function call count doesn't match EXPECT_CALL(*injectedObj, executeSth())...
Expected: to be called once
Actual: never called - unsatisfied and active
[ FAILED ] testFixture.exeuteTest (0 ms)
[----------] 1 test from testFixture (0 ms total)
避免这种情况的最佳方法:始终使基类成为纯虚拟 iface。

关于c++11 - 在 unique_ptr 上 GMOCK EXPECT_CALL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51473824/

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