Соответствие std :: wstring в googlemocks EXPECT_CALL

У меня есть макет интерфейса

// Interface
class MyInterface
{
    void get(const std::wstring& param) = 0;
}

// Mock interface
class MyInterfaceMock : public MyInterface
{
    MOCK_METHOD1(get, void(const std::wstring& param));
}

Образцовый метод испытаний:

...
EXPECT_CALL(myInterfaceMock, L"hello");

Когда я его компилирую (vs2015), я получаю сообщение

ошибка C2664: 'testing :: internal :: MockSpec ...: невозможно преобразовать аргумент 1 из' const wchar_t [6] 'в' const testing :: Matcher & '

за которым следует сообщение: Причина: невозможно преобразовать из 'const wchar_t [7]' в 'const testing :: Matcher'

Когда я использую std :: string вместо std :: wstring, все работает нормально. Кто-нибудь знает, почему нельзя сопоставить std :: wstring?


person anhoppe    schedule 25.11.2016    source источник
comment
какая версия google-mock? Текущий?   -  person PiotrNycz    schedule 28.11.2016
comment
Я использую gmock-1.6.0   -  person anhoppe    schedule 28.11.2016


Ответы (1)


Я думаю, вы имели в виду EXPECT_CALL(myInterfaceMock, get(L"hello"));

Надо написать EXPECT_CALL(myInterfaceMock, get(std::wstring(L"hello"))); все должно работать.

Настоящий вопрос в том, почему сопоставитель из std::string принимает значение const char*. Ответ - потому что библиотека google-mock поддерживала это намеренно - см. код:

template <>
class GTEST_API_ Matcher<internal::string>
    : public internal::MatcherBase<internal::string> {
 public:
  Matcher() {}

  explicit Matcher(const MatcherInterface<internal::string>* impl)
      : internal::MatcherBase<internal::string>(impl) {}

  // Allows the user to write str instead of Eq(str) sometimes, where
  // str is a string object.
  Matcher(const internal::string& s);  // NOLINT

  // Allows the user to write "foo" instead of Eq("foo") sometimes.
  Matcher(const char* s);  // NOLINT
};

Не существует эквивалентной специализации Matcher<T> для std::wstring. Я советую вам не добавлять один - потому что он может измениться в будущем - это деталь реализации gmock. Вместо этого вы можете попросить разработчиков gmock добавить поддержку для wstring таким же образом, как и для _9 _... Кстати, я уже добавил один.

person PiotrNycz    schedule 28.11.2016
comment
Отличный ответ, большое спасибо. Это все объясняет. И, кстати, я имел в виду EXPECT_CALL (myInterfaceMock, get (Lhello)); - person anhoppe; 28.11.2016