有一种方法需要测试:
void DATA::setData(QString path)
{
...........................
QDir dir(path);
if (dir.exists()) {
...................
}
}
是否有可能以某种方式在dir.exists()上设置存根,以便在测试中调用setData方法时返回true,而不管更改路径是什么?
P.S。我使用Google Mock和Google Test。
答案 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
调用它。