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

时间:2015-07-24 20:36:24

标签: inheritance mocking gmock

给出以下两个类:

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

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

我要测试的课程是Derived。但我不想深入Base,我只想检查在doSmt()内调用Base的调用

这样的事情:

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

因为我已经测试了Base,而Base继承了2个类。

有什么办法吗?

2 个答案:

答案 0 :(得分:1)

我被指派为gmock旁边的“邪恶”设计写单元测试。从一开始它比我更难,但我也有自己的解决方案。

虽然比我简单(再次:D)

1.插入基类头中需要的任何模拟。或者您可以创建一个新的并指定其路径包含。

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 dir时,#include <...>会让你更有控制力。

另一个我想分享的重要事项是

不要抽象你的OOP。原因在此之后,你(或你的同事)会遇到很大麻烦。不要继承超过2级,只有1个接口和1个继承。

答案 1 :(得分:0)

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