如何在测试中添加存根?

时间:2017-11-23 09:06:06

标签: c++ qt unit-testing googletest gmock

有一种方法需要测试:

void DATA::setData(QString path)
{
...........................
    QDir dir(path);
    if (dir.exists()) {
        ...................
    }
}

是否有可能以某种方式在dir.exists()上设置存根,以便在测试中调用setData方法时返回true,而不管更改路径是什么?

P.S。我使用Google Mock和Google Test。

1 个答案:

答案 0 :(得分:0)

QDir类没有任何虚拟方法,因此很难模拟它。您可以执行here提到的技巧,但它会强制您使用模板。其他方法(我会这样做)是为QDir定义额外的接口:

class MyAbstractQDirInterface {
public:
    MyAbstractQDirInterface() = default;
    virtual ~MyAbstractQDirInterface() = default;
    virtual bool exists() = 0;
};

class MyConcreteQDirInterface: public MyAbstractQDirInterface {
public:
    MyConcreteQDirInterface() = default;
    ~MyConcreteQDirInterface() override = default;
    bool exists() override {
        // here call the real QDir::exists
    }
};

class MyQDirInterfaceMock: public MyAbstractQDirInterface {
public:
    MOCK_METHOD0(exists, bool());
};

并略微更改setData签名以接受指针(或引用,如果您愿意)到MyAbstractQDirInterface类:

void DATA::setData(MyAbstractQDirInterface* qdirInterface)
{
    // ...
    if (qdirInterface->exists()) {
        // ...
    }
}

然后,在制作中,您可以使用MyConcreteQDirInterface调用此方法,在测试环境中,您可以使用MyQDirInterfaceMock调用它。