Inheritance 如何使用gmock模拟对基类的调用
给出如下2类:Inheritance 如何使用gmock模拟对基类的调用,inheritance,mocking,gmock,Inheritance,Mocking,Gmock,给出如下2类: class Base { public: virtual void doSmt(void); } class Derived : public Base { void doSmt(void) { Base::doSmt(); } } 我需要测试的类是派生的。但我不想深入了解Base,我只想检查对Base的调用是否在doSmt()内部调用 大概是这样的: TEST_F(Derived, DoSmt) { EXPECT_CALL(Base, doSmt()
class Base
{
public:
virtual void doSmt(void);
}
class Derived : public Base
{
void doSmt(void) { Base::doSmt(); }
}
我需要测试的类是派生的。但我不想深入了解Base
,我只想检查对Base的调用是否在doSmt()内部调用
大概是这样的:
TEST_F(Derived, DoSmt)
{
EXPECT_CALL(Base, doSmt()).Times(1);
testedInstance.doSmt();
}
因为我已经对Base进行了测试,并且Base由2个类继承
有什么方法吗?如前所述,没有(直接的)方法来模拟对Base::doSmt()的显式调用。在不知道如何使用Base
类的上下文的情况下,很难做出判断调用,但我的猜测是,使用组合而不是继承来重用Base
提供的功能会更好。这将使测试依赖于Base
的类变得更加容易,因为您可以简单地将一个模拟Base
类注入到派生的中,并验证Base
是否被正确调用。除了gmock之外,我还被指派为“邪恶”设计编写unittest。从一开始这比我想象的要难,但我也有自己的解决办法
这比我想象的要简单(再次:D)
1.在基类头中插入所需的任何模拟。或者您可以创建一个新的并指定其路径
class Base
{
public:
MOCK_METHOD0(mock_doSmt, void());
void doSmt(void);
}
2.要调用基本模拟方法,只需创建BaseStub.cpp
void Base::doSmt(void) { mock_doSmt(); }
此源代码仅用于模拟。因此,您必须编译并链接BaseStub.cpp
而不是Base.cpp
void Base::doSmt(void) { mock_doSmt(); }
3.何时测试
EXPECT_CALL(*reinterpret_cast<Base*>(&derivedInstance), mock_doSmt()).Times(1);
EXPECT\u调用(*reinterpret\u cast(&derivedInstance),mock\u doSmt())。次(1);
模拟doSmt而不是doSmt
这种方法也可以解决单例问题。像上面那样创建SingletonStub,在SetUp()中只需SingletonStance=Singleton::getInstance()代码>
记住:这样,你有2个源和2个头
当面对这个傻瓜时,我意识到应该使用#include
而不是#include“…”
导致当您指定include dir时,#include
将使您可以进行更多控制
我想和大家分享的另一个重要信息是
不要对OOP抽象太多。因为这会让你(或你的同事)在那之后陷入非常大的麻烦。不要继承超过2个级别,只有1个接口和1个继承。有趣的解决方案。我已经做了一个#ifdef GTEST,以确保生产代码不包含“测试内容”+1.