gmock TypedEq相同的字符串不同的地址

时间:2015-11-02 16:43:42

标签: c++ unit-testing googletest gmock

我正在尝试在gmock对象上设置期望值。每当" avout"时,应该适用期望。作为参数传递给我的方法。我设定了这样的期望:

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"

所以看起来即使字符串是相同的,因为它指向在不同的地址处执行该字符串的不同实例,它不匹配?有没有办法让它匹配任何匹配该值的字符串,无论地址是什么?

1 个答案:

答案 0 :(得分:6)

好的,我想通了,所以我想我会为其他任何一个苦苦挣扎的人发布答案。

事实证明,TypedEq&lt; type&gt;只是Matcher&lt; type&gt;(Eq())的简写,而Eq比较字符串的地址而不是值。如果测试和被测试的类都在同一个编译单元中编译,并且你使用原始字符串作为期望和调用,这很好,因为编译器将两个原始字符串优化到同一个地址。如果你的测试和被测试的类在不同的编译单元中,那么原始字符串最终会有不同的地址,这就失败了。

我解决问题的方法是使用Matcher&lt; type&gt;(StrEq())而不是使用TypedEq&lt; type&gt;,因为StrEq会比较字符串值而不是地址。