这是我到目前为止所拥有的.我想要完成的是用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的第一个()中调用打印输出,我建议你模拟出流.
总结以上是内存溢出为你收集整理的c – 如何访问Google Mock中的私人成员全部内容,希望文章能够帮你解决c – 如何访问Google Mock中的私人成员所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)