匹配googlemocks中的std :: wstring EXPECT_CALL

时间:2016-11-25 14:22:28

标签: c++ stl googlemock wstring

我有模拟界面

// 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 ...:无法从' const wchar_t [6]'转换参数1 to' const testing :: Matcher&'

后跟消息: 原因:无法转换为' const wchar_t [7]' to' const testing :: Matcher'

当我使用std :: string而不是std :: wstring时,一切正常。有人知道为什么std :: wstring无法匹配吗?

1 个答案:

答案 0 :(得分:1)

我猜你的意思是EXPECT_CALL(myInterfaceMock, get(L"hello"));

你应该写EXPECT_CALL(myInterfaceMock, get(std::wstring(L"hello")));一切都应该有效。

真正的问题是为什么来自std::string的匹配器接受const char*作为值。答案是 - 因为google-mock库有意支持这一点 - 请参阅code

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类似的方式添加对string的支持... BTW,我已经加入了one