如何模拟Google测试中公共方法正在使用的类中的私有方法? [英] How to mock private methods in a class which is being used by public methods in Google Test?

查看:0
本文介绍了如何模拟Google测试中公共方法正在使用的类中的私有方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类,比如说ClassA,它既有一些公共函数也有一些私有函数。 公共函数轮流类私有函数。 现在我在这里的目的是通过公共函数测试私有函数。 对于公共函数,我尝试调用原始实现,而对于私有方法,我尝试创建一个Mock函数。

我的A班是这样的

class ClassA {
public:
    string getName(string key) {
        int value = 2;
        int code = getCode(value);
        if(code != 2)
             cout<<"Error";
        else
             return "XYZ";
    }

private:
    int getCode(int value) {
        if(value == 2)
             return 2;
        else
             return -1;
    }
};

现在我有了一个ClassA的模拟,

class MockA : public ClassA {
       public:
       MOCK_METHOD1(getName,string(string key)); //Mock for public method
       MOCK_METHOD1(getCode,int(int value))l //Mock for private method
}

这是我的Google测试用例

TEST(ClassATest, Test1)
{
    MockA a;
    Class a1;

    EXPECT_CALL(a,getCode()).Times(1).WillOnce(Return(2));
    EXPECT_CALL(a,getName()).Times(1).WillOnce(Return(Invoke(&a1, 
ClassA::getName());
}

如您所见,对于私有方法,我使用mock,对于公共方法,我使用Invoke并调用原始实现。

现在,当我编译此代码时,我收到一个错误

实际函数调用计数与Expect_Call(a,getCode())不匹配... 预期:将被调用一次 实际:从未调用-不满意且处于活动状态

现在,当我尝试使用getCode()的原始实现时,

EXPECT_CALL(a,getCode()).Times(1).WillOnce(Return(Invoke(&a1, 
ClassA::getCode());

我收到一个编译错误,提示无法访问getCode(),我认为这是预期的。

现在,如果你正在阅读这篇文章,希望你能理解我的问题陈述。 我必须通过传递不同的参数来测试私有方法,通过我通过gtest测试的公共方法。

我想模拟GitHub中this文章所述的私有方法,并调用我的公共方法的原始产品代码。

我做了什么根本错误的事情吗?如果是这样,你们中有谁能为我的用例提供更好的方法。

我已经尝试了Friend_test和tbh,我不希望在我的产品代码中进行任何修改。我会试一试,作为最后的手段。

推荐答案

回答延迟,但我当前正在处理类似的问题,并看到了此问题。

在您的示例中,我不太确定Invoke()的用途,但如果您要做的只是验证对getCode()的调用并控制其返回值,则只需模拟该调用。

您必须修改产品代码以使私有函数成为虚拟的,所以如果这不是一个选项,那么这当然不适用于您。不过,这似乎是一个相当安全的修改。

class ClassA {
public:
    string getName(string key) {
        int value = 2;
        int code = getCode(value);
        if (code != 2)
            return "Error";
        return "XYZ";
    }

private:
    virtual int getCode(int value) {
        if (value == 2)
            return 2;
        return -1;
    }
};

class MockA : public ClassA {
public:
    MOCK_METHOD1(getCode, int(int value));
};

TEST(ClassATest, Test1)
{
    MockA mockA;
    EXPECT_CALL(mockA, getCode(2)).WillOnce(Return(2));
    EXPECT_EQ(mockA.getName("key"), "XYZ");
}

这篇关于如何模拟Google测试中公共方法正在使用的类中的私有方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆