2015-11-02 73 views
3

我想设置对gmock对象的期望。当“avout”作为我的方法的一个参数传递时,期望值应该适用。我设置的期望是这样的:需要gmock TypedEq相同的字符串不同的地址

EXPECT_CALL(actx_mock, getDeviceClientService(TypedEq<const char*>("avout"),_,_)).WillOnce(DoAll(SetArgPointee<2>(&mockAVOut), Return(0))); 

TypedEq因为该方法被重载,接受字符串或一个const char *。当我运行我的测试,我得到以下错误:

CAniSpiceServices_test.cpp:1357: EXPECT_CALL(actx_mock, getDeviceClientService(TypedEq<const char*>("avout"),_,_))... 
    Expected arg #0: is equal to 0x4dbf41 pointing to "avout" 
      Actual: 0x7fbc6861370d pointing to "avout" 

因此,看起来即使字符串是一样的,因为它是指向不同的地址做串的不同实例,这不是”比赛?有没有办法使它匹配任何匹配该值的字符串,而不考虑地址?

+0

请你能发布完整的'EXPECT_CALL' fn吗? – sjsam

+0

好的,这样做。不认为它匹配后做了什么,因为它不匹配。 –

回答

3

好吧,我想通了,所以我想我会发布一个答案,任何其他人正在努力与此。

事实证明TypedEq < type>只是Matcher < type>(Eq())的简写,而Eq比较了字符串的地址而不是值。如果测试和被测试的类都在相同的编译单元中编译,并且您对预期和调用都使用原始字符串,则编译器会将两个原始字符串优化为相同的地址,这样可以。如果你的测试和被测试的类在不同的编译单元中,那么原始字符串会以不同的地址结束,而这会失败。

我做了什么来解决这个问题是不是使用TypedEq <型>,我用匹配器<型>(STREQ()),因为STREQ字符串值,而不是地址进行比较。

+0

更具体地说'Eq()'比较C风格字符串的地址。对于'std :: string','Eq()'工作得很好。 – legalize

+0

很高兴知道 - 谢谢! –

+0

@Dustin很高兴知道你已经整理出来了。 – sjsam

相关问题