首页 文章

如何从模拟方法返回const引用向量项?

提问于
浏览
0

我正在使用数据库对象作为依赖项为类编写基于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 回答

  • 1

    正如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); }));
    

相关问题