我有一个小班:
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));
};
答案 0 :(得分:2)
这有什么问题:
EXPECT_CALL( mockQueue, sendFromIsr( Ref( cmd ) )
.WillOnce( Return( true ) );
由于命令是POD,即使它复制了命令(在这种情况下也不是这样),它应该可以工作。
修改强>
由于Command是POD,因此您需要对其进行初始化(或在创建时清除此类对象占用的内存。在您的示例中:
Command cmd = Command();
然后您的对象将不会被初始化,并且比较不会失败。
答案 1 :(得分:2)
我已经通过googlemock邮件列表discussion here从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'))
))
));
我最喜欢这个解决方案,因为它不需要我过度指定测试或者不必要地在我的生产代码中初始化数据结构。
答案 2 :(得分:-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));