3

我有一个小班:

struct Command
{
    uint8_t cmdId;
    uint8_t len;
    uint8_t payload[MAX_PAYLOAD];
};

我只想使用 googlemock 期望验证有效载荷的前两个元素。我不能使用 ElementsAreArray,因为它会检查有效负载的长度和期望是否相同。到目前为止,我的期望看起来像这样:

Command cmd;
cmd.cmdId = 0xD3;
cmd.len = 2;
cmd.payload[0] = 'm';
cmd.payload[1] = 'l';

EXPECT_CALL(mockQueue,
        sendFromIsr(Pointee(AllOf(
                Field(&Command::cmdId, Eq(0xD3)),
                Field(&Command::len, Eq(2)),
                //Field(&BirdCommand::payload, ElementsAreArray(cmd.payload, 2)) !<-- Doesn't work
        ))))
        .WillOnce(Return(true));

有任何想法吗?模拟类如下所示:

template <typename T>
class MockQueue : public Queue<T>
{
public:
    MOCK_METHOD1_T(sendFromIsr, bool(T &item));
};
4

3 回答 3

2

这有什么问题:

EXPECT_CALL( mockQueue, sendFromIsr( Ref( cmd ) )
        .WillOnce( Return( true ) );

?

由于命令是 POD,因此即使它复制命令(在这种情况下不会),它也应该可以工作。


编辑

由于命令是 POD,因此您需要将其初始化为零(或在创建它时清除此类对象占用的内存。在您的示例中:

Command cmd = Command();

然后您的对象将不会未初始化,并且比较不应失败。

于 2011-02-25T13:48:40.117 回答
2

我通过 googlemock 邮件列表从 Piotr Gorak 那里收到了这个解决方案,在这里讨论

MATCHER_P2(CheckFirstTwo, first, second, "Checks the first two elements of an array")
{
    return arg[0] == first && arg[1] == second;
}

在测试中我这样验证:

EXPECT_CALL(mockQueue, sendFromIsr(
        Pointee(AllOf(
            Field(&BirdCommand::cmdId, Eq(0xD3)),
            Field(&BirdCommand::len, Eq(2)),
            Field(&BirdCommand::payload, CheckFirstTwo('m', 'l'))
        ))
));

我最喜欢这个解决方案,因为它不需要我过度指定测试或零初始化我的生产代码中的数据结构。

于 2011-02-28T09:09:04.290 回答
-1

你有没有尝试过

EXPECT_CALL(mockQueue,
        sendFromIsr(Pointee(AllOf(
                Field(&Command::cmdId, Eq(0xD3)),
                Field(&Command::len, Eq(2)),
                Field(&Command::payload[0], Eq('m')),
                Field(&Command::payload[1], Eq('l'))
        ))))
        .WillOnce(Return(true));
于 2011-02-25T14:40:30.693 回答