如何用gmock模拟基类调用



给定如下两个类:

class Base
{
public:
    virtual void doSmt(void);
}
class Derived : public Base
{
    void doSmt(void) { Base::doSmt(); }
}

需要测试的类是Derived。但我不想深入Base,我只想检查对Base的调用是否在doSmt()

中被调用

像这样:

TEST_F(Derived, DoSmt)
{
    EXPECT_CALL(Base, doSmt()).Times(1);
    testedInstance.doSmt();
}

因为我已经对Base进行了测试,并且Base被2个类继承。

有办法吗?

我被分配为"邪恶"设计编写单元测试,除了gmock。从一开始它就比我想象的要难,但我也有自己的解决方案。

它比我想的简单(再次:D)

1。在基类头中插入所需的任何模拟。或者您可以创建一个新的目录,并指定它的路径include.

class Base
{
public:
    MOCK_METHOD0(mock_doSmt, void());
    void doSmt(void);
}

2。要调用Base模拟方法,只需创建BaseStub.cpp

此源代码仅用于模拟。因此,你必须编译&链接BaseStub.cpp代替Base.cpp

void Base::doSmt(void) { mock_doSmt(); }

3。当测试

EXPECT_CALL(*reinterpret_cast<Base*>(&derivedInstance), mock_doSmt()).Times(1);

mock_doSmt doSmt

这种方法也可以解决Singleton。像上面那样创建SingletonStub,然后在SetUp()中输入singletonInstance = Singleton::getInstance();

记住:这样,你就有了2个源文件和2个头文件。

面对这个傻瓜,我意识到应该使用#include <...>而不是#include "..."

当你指定包含目录时,#include <...>会给你更多的控制。

我想分享的另一个重要内容是

不要抽象太多的OOP。因为这会给你(或你的同事)带来很大的麻烦。

如上所述,没有(直接的)方法来模拟对Base::doSmt()的显式调用。在不知道Base类是如何使用的上下文的情况下,很难做出判断,但我的猜测是,使用组合而不是继承来重用Base提供的功能会更好。这将使测试依赖于Base的类变得容易得多,因为您可以简单地将模拟Base类注入Derived,并验证Base是否被正确调用。

最新更新