gmock TypedEq та же строка другой адрес

Я пытаюсь установить ожидание на объекте 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 ответ

Хорошо, я понял это, поэтому я решил опубликовать ответ для всех, кто борется с этим.

Как оказалось, TypedEq<тип> является просто сокращением для Matcher(Eq ()), а Eq сравнивает адреса, а не значения строк. Если тест и тестируемый класс скомпилированы в одном и том же модуле компиляции, и вы используете необработанные строки как для ожидания, так и для вызова, это нормально, так как компилятор оптимизирует две необработанные строки в один и тот же адрес. Если ваш тест и тестируемый класс находятся в разных единицах компиляции, то необработанные строки заканчиваются разными адресами, и это не удается.

Чтобы решить проблему, я вместо TypedEqиспользовал Matcher(StrEq ()), поскольку StrEq сравнивает строковые значения, а не адреса.

Другие вопросы по тегам