我有模拟界面
// 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无法匹配吗?
答案 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。