JUnit でログ メッセージをアサートするにはどうすればよいですか?

DDD
リリース: 2024-10-30 07:38:02
オリジナル
808 人が閲覧しました

How to Assert on a Log Message in JUnit?

JUnit でログ メッセージにアサートする方法

概要:

外部と通信するコードの動作のテストシステムでは、生成されたメッセージの内容と形式を検証することがよくあります。 Java では、このようなメッセージを記録する一般的な方法はロギングです。この記事では、JUnit フレームワークを使用してログ エントリの単体テストを実行する方法について説明します。

ログ メッセージの JUnit アサーション:

質問で提供されているコード スニペットは、アサートすることを目的としています。特定のレベル (例: INFO) とメッセージ (「x が発生しました」) を持つ特定のログ エントリがテスト対象のコードによって生成されたこと。これを実現するには、ログ イベントをインターセプトして保存するカスタム ロガーまたはハンドラーを採用できます。

カスタム ロガー/ハンドラーのアプローチ:

このアプローチでは、特殊なロガーを作成する必要があります。またはロギング イベントをキャプチャするハンドラー。テスト対象のコード内のログ ステートメントはこのカスタム ロガーに送信され、ログに記録されたメッセージの取得と検査が可能になります。ただし、このアプローチは実装が複雑になる可能性があり、テスト対象のコードを変更する必要があります。

ログ コレクター パターン:

より便利な解決策は、カスタム アペンダーを使用することです。ログ イベントをコレクションまたはリストに記録します。これを実現する方法は次のとおりです:

  1. Appender の作成:
    カスタム Appender サブクラスを実装し、append() メソッドをオーバーライドしてロギング イベントをデータ構造に保存します (例: リスト)。
  2. ロガーにアペンダーを追加:
    カスタム アペンダーのインスタンスを目的のロガーに追加します。このステップは、テスト メソッド内で実行するか、@Before や @After などの注釈を使用して実行できます。
  3. ログ メッセージ アサーション:
    テスト対象のコードを実行した後、ログに記録されたメッセージのリストを取得します。アペンダーからのイベント。その後、提供されたコード スニペットに示すように、JUnit のアサーション メソッドを使用して、ログ エントリのレベル、メッセージ、その他の属性を検証できます。

サンプル実装:

次のサンプル コードは、ログ コレクター パターンを示しています。

<code class="java">import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;

public class LogCollectorTest {

    @Test
    public void testLogMessage() {
        // Create a custom appender to collect logging events.
        final TestAppender appender = new TestAppender();

        // Add the appender to the logger we wish to test.
        final Logger logger = Logger.getLogger(LogCollectorTest.class);
        logger.addAppender(appender);

        // Execute code under test.
        logger.info("Test");

        // Retrieve the list of logged events.
        final List<LoggingEvent> logs = appender.getLog();

        // Perform assertions on the first log entry.
        assertThat(logs.get(0).getLevel(), is(Level.INFO));
        assertThat(logs.get(0).getMessage(), is("Test"));
    }

    private static class TestAppender extends AppenderSkeleton {
        private final List<LoggingEvent> log = new ArrayList<>();

        @Override
        public boolean requiresLayout() {
            return false;
        }

        @Override
        protected void append(LoggingEvent loggingEvent) {
            log.add(loggingEvent);
        }

        @Override
        public void close() { }

        public List<LoggingEvent> getLog() {
            return new ArrayList<>(log);
        }
    }
}</code>
ログイン後にコピー

結論:

ログ コレクター パターンは、再利用可能で便利なアサート方法を提供します。 JUnit テストのログ メッセージ。ログに記録されたイベントをデータ構造にキャプチャすると、その内容と形式を簡単に検証でき、コードとログ システムのやり取りの正確性を確保できます。

以上がJUnit でログ メッセージをアサートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート