加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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的第一个()中调用打印输出,我建议你模拟出流.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读