使用gmock

时间:2016-12-28 20:45:54

标签: c++ gmock

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

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

我发现自己处于相同的情况几次,我有两种可能的策略:

  • 您可以定义自定义匹配器(请参阅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));

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

答案 1 :(得分:1)

你可以这样做:

from proj.tasks import *

在这里,我们创建了一个特定的匹配器,用于比较两个MATCHER_P(CompareCustomArray, expectedArray, "") { CustomArray* customArray = std::get<0>(arg); return ((*customArray) == (*expectedArray)); } CustomArray actualBuffer("Expected Buffer Value"); EXPECT_CALL(usbMock, Write(CompareCustomArray(&actualBuffer), expectedBufferLength)); 和它&#34;传递&#34;如果他们是平等的。