c++ - 使用 gmock 保存 C 样式数组值

标签 c++ googlemock

我对我的一个对象有以下期望:

EXPECT_CALL(usbMock, Write(_, expectedBufferLength));

其中“_”参数是传递给 usbMock 上的 Write 函数的缓冲区。

我需要获取该缓冲区内的值,以便我可以运行自己的数组比较函数(ElementsAreArray 和 ElementsAre 对我来说不起作用,因为我需要带有预期/实际数组的确切内容的自定义输出消息,并且我的数组也超过 10 个字节长);

无论如何,我已经非常接近解决我的问题了:

byte* actualBuffer;
EXPECT_CALL(usbMock, Write(_, expectedBufferLength)).WillOnce(SaveArg<0>(&actualBuffer));

问题是这是一个集成测试,当我能够对其进行操作时,actualBuffer 指向的缓冲区已被释放。

我的问题是,如何保存actualBuffer的内容以供以后检查,而不是仅仅获取指向它的指针。

最佳答案

我发现自己多次遇到同样的情况,我可以提供两种潜在的策略:

  • 您可以定义自定义匹配器(请参阅 MATCHER_Px 宏)
  • 您可以使用Invoke并在回调中执行您需要的操作

在您的情况下,这取决于您是否知道调用代码时会发生什么:如果您已经知道,那么您可以定义一个在参数中采用预期数组的匹配器,否则如果您需要保存后就可以使用Invoke中的回调来执行深拷贝了。


一些代码示例:

// Invoke
EXPECT_CALL(usbMock, Write(_, expectedBufferLength))
        .WillOnce(Invoke([expectedBuffer](byte* actualBuffer, size_t length) {
            // Substitute for your matching logic
            for (size_t i = 0; i != length; ++i) {
                EXPECT_EQ(actualBuffer[i], expectedBuffer[i]);
            }
        });

以及匹配器:

MATCHER_P2(ByteBufferMatcher, buffer, length, "") {
    return std::equal(arg, arg + length, buffer);
}

// Usage
EXPECT_CALL(usbMock,
    Write(ByteBufferMatcher(expectedBuffer, expectedLength), expectedLength));

请注意,后者使得提供自定义错误消息变得更加困难。

关于c++ - 使用 gmock 保存 C 样式数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41369470/

相关文章:

c++ - 如何使我的结构变量对所有函数都可见?

c++ - 如何正确地使模拟方法调用原始虚方法

c++ - 我如何用两个不同的参数值调用我的模拟方法两次

c++ - 模拟免费功能

c++ - std::launder 的可达性

c++ - 将字符串中表示的大数除以 3

c++ - MSVC 中可能的编译器错误

c++ - 类对象也管理树结构?

c++ - googlemock - 模拟一个返回复杂数据类型的方法

c++ - gtest/gmock 匹配器,用于一对迭代器之间的子序列