私の Qt アプリケーションは、(デフォルトで) アプリケーションを中止する qFatal() を呼び出す Q_ASSERT_X を使用します。これはアプリケーションにとっては素晴らしいことですが、アプリケーションの単体テスト時にはその動作を抑制したいと考えています。(私はGoogle Test Frameworkを使用しています。)別のプロジェクトで単体テストを行い、テストしているクラスに静的にリンクしています。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();
}
しかし、私のアプリケーションはまだアサートで停止しています。テストを実行したときの出力は次のとおりであるため、カスタム ハンドラーが呼び出されていることがわかります。
My Fatal: MyClass::doSomething での ASSERT 失敗: "doSomething()"、ファイル myclass.cpp、21 行目 プログラムが予期せず終了しました。
アサートが失敗した場合でもテストを実行し続けるにはどうすればよいですか?