我有一个巨大的遗留代码,我不应该对现有代码进行任何更改。现在,如果我必须使用该类的指针及其非虚方法在类(例如class A
)上执行单元测试,该类调用另一个类的方法(比如Class B
)。如何使用google mock
模拟Class B
的方法?
我已阅读过以下方法:
1.使其虚拟;
2.使用模板。
但我对改变现有遗留代码不感兴趣。
提前致谢!
答案 0 :(得分:0)
您要在以下位置执行单元测试的类:
class A {
public:
int do_a_work(B * bPtr) {
std::cout << "-- in a::do_a_work ---" << std::endl;
return 1 + bPtr->do_b_work();
}
};
您无法修改的课程:
// Class that we are *NOT* going to modify
class B {
public:
int do_b_work() {
std::cout << "-- in b::do_b_work ---" << std::endl;
return 2;
}
};
您的生产(非测试)代码。
A a;
B b;
a.do_a_work(&b); // b->do_b_work will be called ...
更新A类以使用模板。
template <class B_class>
class A {
public:
int do_a_work(B_class * bPtr) {
std::cout << "-- in a::do_a_work ---" << std::endl;
return 1 + bPtr->do_b_work();
}
};
在生产代码中,使用真正的B类。
A<B> aObj;
B bObj;
std::cout << aObj.do_a_work(&bObj) << std::endl;
在测试代码中,使用模拟的B类。
// Mock class.
// It doesn't inherit from B.
class B_Mock {
public:
MOCK_METHOD0(do_b_work, int());
};
在测试代码中调用mock类:
// Use the mocked class
B_Mock b;
A<B_Mock> a;
a.do_a_work(); // this will use the B_Mock->do_b_work MOCK_METHOD0.
创建一个新类,其中包含您不想修改的类的实例。
// Add B Container class
class B_Container : public B{
private:
B my_b;
public:
B_Container() {}
// Make all public functions virtual (so that we can mock them out)
virtual int do_b_work() {
// Forward all work to B
return my_b.do_b_work();
}
// repeat for all other public functions ...
};
然后,修改A类以使用B_container而不是B.
class A {
public:
int do_a_work(B_Container * bPtr) {
std::cout << "-- in a::do_a_work ---" << std::endl;
return 1 + bPtr->do_b_work();
}
};
在制作中,您的代码如下所示:
A a;
B_Container b; // This was just "B b;"
a.do_a_work(&b);
现在B_Container有一个虚函数,你可以模拟这样的调用:
class B_Mock : public B_Container{
public:
MOCK_METHOD0(do_b_work, int());
};
在测试代码中,您可以这样做:
B_Mock b;
A a;
a.do_a_work(); // This will call B_Mock->do_b_work, which inherits from B_Container