My Qt application uses Q_ASSERT_X, which calls qFatal(), which (by default) aborts the application. That's great for the application, but I'd like to suppress that behavior when unit testing the application. (I'm using the Google Test Framework.) I have by unit tests in a separate project, statically linking to the class I'm testing. The documentation for qFatal() reads:
Calls the message handler with the
fatal message msg. If no message
handler has been installed, the
message is printed to stderr. Under
Windows, the message is sent to the
debugger.
If you are using the default message
handler this function will abort on
Unix systems to create a core dump. On
Windows, for debug builds, this
function will report a _CRT_ERROR
enabling you to connect a debugger to
the application.
...
To supress the output at runtime,
install your own message handler with
qInstallMsgHandler().
So here's my main.cpp file:
#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();
}
But my application is still stopping at the assert. I can tell that my custom handler is being called, because the output when running my tests is:
My Fatal: ASSERT failure in
MyClass::doSomething: "doSomething()",
file myclass.cpp, line 21 The program
has unexpectedly finished.
What can I do so that my tests keep running even when an assert fails?