我的 Qt 应用程序使用 Q_ASSERT_X,它调用 qFatal(),它(默认情况下)中止应用程序。这对应用程序来说很好,但我想在对应用程序进行单元测试时抑制这种行为。(我正在使用Google 测试框架。)我在一个单独的项目中进行单元测试,静态链接到我正在测试的类。qFatal()的文档内容如下:
使用致命消息 msg 调用消息处理程序。如果没有安装消息处理程序,则将消息打印到 stderr。在 Windows 下,消息被发送到调试器。
如果您使用默认消息处理程序,此函数将在 Unix 系统上中止以创建核心转储。在 Windows 上,对于调试版本,此函数将报告 _CRT_ERROR 使您能够将调试器连接到应用程序。
...
要在运行时抑制输出,请使用 qInstallMsgHandler() 安装您自己的消息处理程序。
所以这是我的 main.cpp 文件:
#include <gtest/gtest.h>
#include <QApplication>
void testMessageOutput(QtMsgType type, const char *msg) {
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s\n", msg);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stderr, "My Fatal: %s\n", msg);
break;
}
}
int main(int argc, char **argv)
{
qInstallMsgHandler(testMessageOutput);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
但是我的应用程序仍然在断言处停止。我可以说我的自定义处理程序正在被调用,因为运行我的测试时的输出是:
我的致命:MyClass::doSomething 中的 ASSERT 失败:“doSomething()”,文件 myclass.cpp,第 21 行 程序意外完成。
即使断言失败,我该怎么做才能让我的测试继续运行?