Inheritance 如何使用gmock模拟对基类的调用

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()

给出如下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()).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.