C++ 如何打破对没有接口、没有虚拟函数、没有设置器的Qt类的依赖关系

C++ 如何打破对没有接口、没有虚拟函数、没有设置器的Qt类的依赖关系,c++,qt,unit-testing,mocking,C++,Qt,Unit Testing,Mocking,我有一个类,它创建QFileInfo和QImage实例以及指向它们的智能指针(后者通过QImageReader)。我想在测试中用MockQFileInfo替换QFileInfo,因为这样我可以测试几种不同的文件状态(不存在、没有读取权限、绝对路径与相对路径等)。如果我也能有一个MockQImageReader就好了,因为这样我可以控制返回的图像(如果有的话)并模拟返回的错误代码 问题是,QFileInfo和QImageReader都没有虚拟的方法或接口,所以我认为“正常”的依赖注入技术不起作用。

我有一个类,它创建QFileInfo和QImage实例以及指向它们的智能指针(后者通过QImageReader)。我想在测试中用MockQFileInfo替换QFileInfo,因为这样我可以测试几种不同的文件状态(不存在、没有读取权限、绝对路径与相对路径等)。如果我也能有一个MockQImageReader就好了,因为这样我可以控制返回的图像(如果有的话)并模拟返回的错误代码

问题是,QFileInfo和QImageReader都没有虚拟的方法或接口,所以我认为“正常”的依赖注入技术不起作用。根据GoogleMock食谱,模板化类可能是一种解决方案,但Q_对象不支持模板化类

以下是ImageReader类的函数实现,该类派生自IIImageReader接口,该接口本身继承自QObject:

QPair<QSharedPointer<QFileInfo>, QSharedPointer<ImgCont>> ImageReader::readImageFromFile(const QString& filePath)
{
    createFileInfo(filePath);
    createImgCont();

    return QPair<QSharedPointer<QFileInfo>, QSharedPointer<ImgCont>>(mImgFile, mImg);
}

void ImageReader::createFileInfo(const QString& filePath)
{
    mImgFile = QSharedPointer<QFileInfo>::create(filePath);
    if (!mImgFile->isAbsolute()) mImgFile->makeAbsolute();
}

void ImageReader::createImgCont()
{
    QImage qImg;
    QString errorMsg = readImageFile(&qImg);

    if (qImg.isNull()) {
        // throw or signal errorMsg here;
        mImg = QSharedPointer<ImgCont>();
    } else {
        mImg = QSharedPointer<ImgCont>::create(std::move(qImg));
    }
}

QString ImageReader::readImageFile(QImage* img)
{
    QImageReader imgReader(mImgFile->filePath());
    if (imgReader.read(img)) {
        return QString();
    } else {
        return imgReader.errorString();
    }
}
QPair ImageReader::readImageFromFile(常量QString&filePath)
{
createFileInfo(文件路径);
createImgCont();
返回QPair(mImg文件,mImg);
}
void ImageReader::createFileInfo(常量QString和文件路径)
{
mImgFile=QSharedPointer::create(文件路径);
如果(!mImgFile->isAbsolute())mImgFile->makeAbsolute();
}
void ImageReader::createImgCont()
{
齐玛格·齐姆格;
QString errorMsg=readImageFile(&qImg);
if(qImg.isNull()){
//在这里抛出或发出错误信号;
mImg=QSharedPointer();
}否则{
mImg=QSharedPointer::create(std::move(qImg));
}
}
QString ImageReader::readImageFile(QImage*img)
{
QImageReader imgReader(mImgFile->filePath());
if(imgReader.read(img)){
返回QString();
}否则{
返回imgReader.errorString();
}
}
有没有办法取代QImageReader,更具体地说是QFileInfo?我认为我可以将readImageFile函数设置为虚拟函数,并在ImageReader tester类中重写它,以返回我想要的任何QImage和错误消息,但我无法理解QFileInfo(它也没有设置器或获取器来用伪数据替换数据)。更大的问题是,它也将被传递到其他地方,我还想测试其他类,显然是使用不同的伪QFileInfo内容


提前感谢。

我认为解决这个问题的一个方法可能是简单地将QFileInfo和QImage打包成一个类(它们无论如何都属于一个类),并为QFileInfo的属性提供虚拟getter函数。整个设置逻辑(简化版本)可以移动到包装类的构造函数中,如果出现错误,可以抛出异常(如果出现错误,QImageReader会告诉我们)。我认为这个解决方案是目前最能证明未来的。有什么想法吗?