gpt4 book ai didi

c++ - 如何从模拟方法返回对 vector 项的常量引用?

转载 作者:行者123 更新时间:2023-11-30 03:19:28 24 4
gpt4 key购买 nike

我正在为一个使用数据库对象作为依赖项的类编写基于 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 上遇到错误:

warning C4172: returning address of local variable or temporary

我预计 GMock 生成的包装器会在某个地方从 lambda 返回的引用中复制一份拷贝,但很难理解那些困惑的代码。无论如何,如何在不更改界面的情况下实现我所需要的?

最佳答案

this answer 阐明,TEST_DATA.at(i) 表达式的类型是 Entry,而不是 const Entry&,因此 lambda 的返回类型推导为非引用,导致问题。

这是通过显式声明 lambda 的返回类型来解决的:

EXPECT_CALL(mock, entry).WillOnce(Invoke([](int i) -> const Entry& { return TEST_DATA.at(i); }));

关于c++ - 如何从模拟方法返回对 vector 项的常量引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53693976/

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