2011-02-25 27 views
3

我有一个小类:Googlemock:如何验证对象中数组中的元素?

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

sendFromIsr方法的签名是什么? – 2011-02-25 13:20:16

+0

@VJo我添加了模拟定义 – mikelong 2011-02-25 13:24:15

回答

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')) 
     )) 
)); 

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

+0

这是为什么被拒绝?它完全解决了我如何指定它的问题。 – mikelong 2011-02-28 09:23:36

2

什么是错的:

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

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


编辑

因为该命令是POD,你需要零初始化(或当您创建它清除这种物体所占用的内存在您的例子:

Command cmd = Command(); 

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

+0

感谢您的回复。不幸的是,这不会工作,因为整个消息没有写入。这意味着剩余的有效载荷将有所不同(但没关系,因为它们是无效的)。 – mikelong 2011-02-25 13:59:47

+0

@mikelong也许是因为你的命令是POD,并且像你声明的变量'cmd'那样它可能包含垃圾。尝试将它初始化为零,并查看它是否有效。 – 2011-02-25 15:06:32

-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)); 
+0

是的,不幸的是,它不能编译。 g ++消息是“错误:引用'Command :: payload'时丢失了对象” – mikelong 2011-02-25 14:44:58

相关问题