【问题标题】:Google mock: Mocking parent class?谷歌模拟:模拟父类?
【发布时间】:2017-08-07 12:38:15
【问题描述】:

假设我有一个基类:

class Command {
public:
    virtual int8_t Execute();
};

在基类 cpp 中有定义。

另外,我有一个子类:

class SpecificCommand: public Command {
public:
    int8_t Execute();
};

有定义:

int8_t SpecificCommand::Execute() {
    doSomeStuff();
    Command::Execute();
}

如何模拟 Command::Execute() 但使用 SpecificCommand 对象进行测试?

【问题讨论】:

    标签: c++ unit-testing testing mocking googlemock


    【解决方案1】:

    也许是这样的:

    class SpecificCommandMock : public SpecificCommand
    {
    public:
        MOCK_METHOD0(ExecuteMockedMethod, void());
        int8_t Execute() override
        {
            doSomeStuff()
            ExecuteMockedMethod();
        }
    }
    

    当然,您应该在单元测试中使用SpecificCommandMock,并在预期被测类调用Execute() 时将EXPECT_CALL 设置为ExecuteMockedMethod

    此外,我认为如果您必须做这些事情,应用程序的设计可能会出现问题。

    【讨论】:

    • 感谢您的回答。您能否澄清您认为实际生产代码设计可能有什么问题?
    • 作为一般规则,每个单独的公共方法通常都应该是可测试的,所以你为什么只需要模拟 Command::Execute()? 你确定使用例如EXPECT_CALL(...).WillRepeatedly(Return(something)) 在你的情况下不是很好的解决方案吗?
    • Command::Execute() 包含无法使用 googletest 测试的网络访问,因为测试未在目标系统上执行。所以我想模拟(或者在这种情况下是假的?)它。 Execute 确实修改了 Command 中声明的一些成员变量。你知道更好的方法吗?
    • 我会考虑提取负责网络连接到单独类的部分。接下来,我可以在SpecificCommandMock 构造函数中将引用(或指针)传递给此类的实例。在生产代码中,它将是对真正连接到网络的类的引用,但在单元测试中,它只是模拟的。
    猜你喜欢
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多