c – 如何访问Google Mock中的私人成员
发布时间:2020-12-16 07:12:21 所属栏目:百科 来源:网络整理
导读:我正在尝试为具有私有向量的类编写模拟,该向量将数据插入到私有向量中.但是,我没有看到使用Google Mock的方法.理想情况下,我想在我的界面中没有与测试相关的任何内容.此外,我不想使私有向量受保护并将类子类化并添加一个访问器方法,因为这会导致我的代码泄漏
我正在尝试为具有私有向量的类编写模拟,该向量将数据插入到私有向量中.但是,我没有看到使用Google Mock的方法.理想情况下,我想在我的界面中没有与测试相关的任何内容.此外,我不想使私有向量受保护并将类子类化并添加一个访问器方法,因为这会导致我的代码泄漏其实现.
这是我到目前为止所拥有的.我想要完成的是用Fake类插入数据,并使用Mock类在指向Fake类的指针上调用Real :: first()(这样我就可以使用Fake的向量而不是Real的).编译此程序时,返回-1而不是4. #include <iostream> #include <vector> #include <gmock/gmock.h> using namespace std; //using ::testing::_; using ::testing::Invoke; class A { protected: vector<int> a; public: virtual int first() = 0; virtual ~A() {} }; class Real : public A { public: virtual int first() { cout << "size: " << a.size() << endl; return a[0]; } }; class Fake : public A { public: virtual void insert(int b) { a.push_back(b); cout << a.size() << endl; } private: virtual int first() { return -1; } }; class Mock : public A { public: Mock(Fake* c) : c_(c) {} MOCK_METHOD0(first,int()); void delegate() { ON_CALL(*this,first()) .WillByDefault(Invoke((Real*)c_,&Real::first)); } private: Fake* c_; }; int main(void) { Fake c; c.insert(4); Mock z(&c); z.delegate(); cout << z.first() << endl; return 0; } 有谁知道我做错了什么?或者有更简单的方法来实现这一目标吗? 解决方法
赋予Mock的实现实例c是一个伪对象,并且指向它的指针的任何数量都不会使它成为Real.因为Fake和Real都从A派生first(),即使编译器认为它调用了Real的first()函数,也会成功调用Fake对象的first().
告诉它你想要什么并不是那么容易,因为你的例子是如此之小(并且在最小的情况下嘲笑并不是真的必要),但是有很多方法可以实现你想要的行为,一些不在顶层我的头: 选项1 在A中提供first的默认定义并从Fake中删除定义: class A { protected: vector<int> a; public: virtual int first() { return a[0]; } virtual ~A() {} }; class Fake : public A { public: virtual void insert(int b) { a.push_back(b); cout << a.size() << endl; } }; 选项2 假的第一个工作定义.我知道,我知道,这段代码不属于假,但它是一个快速修复这样一个微不足道的案例. class Fake : public A { public: virtual void insert(int b) { a.push_back(b); cout << a.size() << endl; } private: virtual int first() { return a[0]; } }; 选项3 如果所有这些都是关于不在A的第一个()中调用打印输出,我建议你模拟出流. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |