How to mock private methods in a class which is being used by public methods in Google Test?(如何模拟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测试中公共方法正在使用的类中的私有方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何模拟Google测试中公共方法正在使用的类中的私有方法?
- XML Schema 到 C++ 类 2022-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- GDB 不显示函数名 2022-01-01
- DoEvents 等效于 C++? 2021-01-01
- 如何提取 __VA_ARGS__? 2022-01-01
- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- 将 hdc 内容复制到位图 2022-09-04
- OpenGL 对象的 RAII 包装器 2021-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01