C++ 将wxString与googlemock一起使用

C++ 将wxString与googlemock一起使用,c++,unit-testing,wxwidgets,googlemock,C++,Unit Testing,Wxwidgets,Googlemock,有没有人幸运地将Google Mock与wxWidgets结合使用?我有一个Foo类,其中的setter在签名中对wxString进行常量引用,如下所示: class Foo { public: Foo(); virtual ~Foo(); void setName(const wxString& name); }; 然后我继续模拟Foo,如下所示: class MockFoo : public Foo { MOCK_METHOD1(setName, v

有没有人幸运地将Google Mock与wxWidgets结合使用?我有一个Foo类,其中的setter在签名中对wxString进行常量引用,如下所示:

class Foo {
public:
    Foo();
    virtual ~Foo();
    void setName(const wxString& name);
};
然后我继续模拟Foo,如下所示:

class MockFoo : public Foo {
    MOCK_METHOD1(setName, void(const wxString& name));
};
我的其他mock工作得很好,但是wxString参数有一些不喜欢的地方。编译时,我会看到以下内容:

C:\gmock-1.6.0\gtest\include\gtest\internal\gtest-internal.h:890: error: conversion from `const wxUniChar' to `long long int' is ambiguous
C:\wxWidgets-2.9.0\include\wx\unichar.h:74: note: candidates are: wxUniChar::operator char() const
C:\wxWidgets-2.9.0\include\wx\unichar.h:75: note:                 wxUniChar::operator unsigned char() const
//more potential candidates from wxUniChar follow after that

jist是Google Mock无法确定调用哪个操作符()函数,因为wxUniChar提供的操作符()函数没有映射到Google Mock所期望的。我在“long-long-int”和“testing::internal::BiggestInt”转换中看到了这个错误

这一定是由于使用代理类
wxUniCharRef
,作为
wxString::operator[]()
的结果类型(有关详细信息,请参阅的“粗心陷阱”一节),但我不确定它到底来自何处,因为这里似乎没有任何代码访问wxString字符。
gtest internal.h
的第890行到底是什么


另外,您说您正在使用对wxString的const引用,但您的代码没有。我认为这与您的问题不太相关,但描述和代码片段之间存在这种差异令人困惑…

对wxUniChar头文件的以下添加似乎有效:

wxUniChar(long long int c) { m_value = c; }

operator long long int() const { return (long long int)m_value; }

wxUniChar& operator=(long long int c) { m_value = c; return *this; }

bool operator op(long long int c) const { return m_value op (value_type)c; }

wxUniCharRef& operator=(long long int c) { return *this = wxUniChar(c); }

operator long long int() const { return UniChar(); }

bool operator op(long long int c) const { return UniChar() op c; }

我将它们插入头文件的适当部分,编译错误消失了。如果我以后有时间,我将为wxWidgets开发一个补丁,并进行一些单元测试,如果这听起来是一个合理的解决方案。

很抱歉不一致。我更新了示例。我可以通过为“long-long int”类型的wxUniChar添加构造函数和各种operator=和operator()函数并构建wxWidgets来解决我的问题。如果我们真的需要在同一个表达式中混合
wxUniChar
long
,那么我们真的需要这个(对于
无符号long-long
也是如此).但我仍然想知道为什么首先需要这样做…我相信这是因为Google Test在一些内部代码中使用了它称之为“BiggestInt”的类型,这些代码可能对Google模拟对象执行验证。它看起来像是long long int或_int64,具体取决于平台。