我正在使用数据库对象作为依赖项为类编写基于googletest / googlemock的单元测试,因此我决定模拟数据库 . 它基于索引提供对 Entry
类型的项的只读访问:
struct Entry {
int x, y;
};
class DbIface {
public:
virtual ~DbIface() {}
virtual int count() const = 0;
virtual const Entry& entry(const int idx) const = 0;
};
class DbMock : public DbIface {
public:
MOCK_CONST_METHOD0(count, int());
MOCK_CONST_METHOD1(entry, const Entry&(const int idx));
};
我想为测试指定一些预定义的数据,并使模拟返回:
const std::vector<Entry> TEST_DATA = { { 0, 1 }, { 2, 3 }, { 4, 5 } };
DbMock mock;
EXPECT_CALL(mock, count).WillOnce(Return(TEST_DATA.size()));
EXPECT_CALL(mock, entry).WillOnce(Invoke([](int i) { return TEST_DATA.at(i); }));
但是,我在最后 EXPECT_CALL
收到错误:
警告C4172:返回局部变量的地址或临时变量
我希望GMock生成的包装器能够从一路上的lambda返回的引用中复制一个副本,但是很难跟上那些混乱的代码 . 无论如何,如何在不改变界面的情况下实现我的需求?
1 回答
正如this answer所阐明的那样,
TEST_DATA.at(i)
表达式的类型是Entry
,而不是const Entry&
,因此lambda的返回类型推断为非引用,导致问题 .这是通过显式声明lambda的返回类型来解决的: