c – 如何访问Google Mock中的私人成员

c – 如何访问Google Mock中的私人成员,第1张

概述我正在尝试为具有私有向量的类编写模拟,该向量将数据插入到私有向量中.但是,我没有看到使用Google Mock的方法.理想情况下,我想在我的界面中没有与测试相关的任何内容.此外,我不想使私有向量受保护并将类子类化并添加一个访问器方法,因为这会导致我的代码泄漏其实现. 这是我到目前为止所拥有的.我想要完成的是用Fake类插入数据,并使用Mock类在指向Fake类的指针上调用Real :: first 我正在尝试为具有私有向量的类编写模拟,该向量将数据插入到私有向量中.但是,我没有看到使用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的第一个()中调用打印输出,我建议你模拟出流.

总结

以上是内存溢出为你收集整理的c – 如何访问Google Mock中的私人成员全部内容,希望文章能够帮你解决c – 如何访问Google Mock中的私人成员所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存