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

Dus*_*lmi 6 c++ unit-testing googletest gmock

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

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

需要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"
Run Code Online (Sandbox Code Playgroud)

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

Dus*_*lmi 6

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

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

我为解决这个问题而采取的是使用TypedEq <type>而不是使用Matcher <type>(StrEq()),因为StrEq比较字符串值而不是地址.