使用 gtest 测试来自 MOCK_METHOD 调用的 std::vector 参数

问题描述 投票:0回答:2

有没有办法将向量引用中的数据存储到 MOCK_METHOD?

我有以下模拟界面:

MOCK_METHOD(bool, SetData, (const std::vector<uint8_t>& data), (override));

我想测试发送到这个模拟方法的数据,例如。

std::vector<uint8_t> test_data;
EXPECT_CALL(testClass, SetData(_)).SaveArg<0>(&test_data);
EXPECT_EQ(test_data[0], 42);
c++ googletest googlemock
2个回答
1
投票

可以做到,见下文。但请注意,匹配器,即使是更复杂的匹配器,通常也被认为是更干净的解决方案。

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <vector>

using namespace testing;

struct I
{
    virtual bool setData(const std::vector<std::uint8_t>&) = 0;
    virtual ~I() = default;
};

struct S : I
{
    MOCK_METHOD(bool, setData, (const std::vector<uint8_t>& data), (override));
};


TEST(aaa, bbb)
{
    S s;
    std::vector<std::uint8_t> target;
    std::vector<std::uint8_t> source{1,2,3,4,5};
    EXPECT_CALL(s, setData).WillOnce(
        DoAll(
            SaveArg<0>(&target),
            Return(true)
        )
    );
    s.setData(source);
    EXPECT_EQ(source, target);
}

https://godbolt.org/z/4MrEPvaa3


0
投票

您根本不必保存参数。只需使用匹配器来检查内容是否符合您的期望:

TEST(X, Y)
{
    std::vector<uint8_t> expectedData {42, 1, 2, 3};
    // if not matcher is specified explicitly, `::testing::Eq` is used
    EXPECT_CALL(testClass, SetData(expectedData)).WillOnce(::testing::Return(true));
}
© www.soinside.com 2019 - 2024. All rights reserved.