ログ出力内容確認テスト(Junit5)

ログ出力内容確認テスト(Junit5)

logunitを使用して検証する方法を説明する。
logunit(Github)

依存関係の追加

gradleを使用している場合は、build.gradleに以下の記述を追加する。

dependencies {
    testImplementation "io.github.netmikey.logunit:logunit-core:1.1.3"
    testRuntimeOnly "io.github.netmikey.logunit:logunit-logback:1.1.3"
}

mavenを使用している場合は、pom.xmlに以下の記述を追加する。

<dependencies>
    <dependency>
        <groupId>io.github.netmikey.logunit</groupId>
        <artifactId>logunit-core</artifactId>
        <version>1.1.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.github.netmikey.logunit</groupId>
        <artifactId>logunit-logback</artifactId>
        <version>1.1.3</version>
        <scope>test</scope>
    </dependency>
</dependencies>

検証方法

LogCapturerを使用してログのキャプチャ設定を行い、出力されたログの内容を検証する

import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.HashMap;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.slf4j.event.Level;
import org.slf4j.event.LoggingEvent;
import io.github.netmikey.logunit.api.LogCapturer;

class SampleLogTest {

    // ログのキャプチャ設定(キャプチャ対象のクラスとログレベルを指定可能)
    @RegisterExtension
    LogCapturer logs = LogCapturer.create().captureForType(LogExample.class, Level.WARN);

    @Test
    public void execute_ログ検証() {

        // テスト実行
        new LogExample().execute();

        // ログ出力内容確認(Warn以上のログのみ)
        List<LoggingEvent> events = logs.getEvents();
        assertEquals(events.size(), 3);
        assertEquals(events.get(0).getMessage(), "error log 1");
        assertEquals(events.get(1).getMessage(), "error log 2");
        assertEquals(events.get(2).getMessage(), "warn log 1");

        // Debug、Infoは含まれない
        logs.assertDoesNotContain("debug log 1");
        logs.assertDoesNotContain("info log 1");

    }

    /**
     * テスト対象クラス
     */
    class LogExample {
        public void execute() {
            // MDCを初期化
            MDC.setContextMap(new HashMap<String, String>());

            var logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LogExample.class);

            logger.info("info log 1");
            logger.error("error log 1");
            logger.debug("debug log 1");
            logger.error("error log 2");
            logger.warn("warn log 1");
        }
    }
}

Junit5の使用方法も記事にしているのでよかったらご覧ください。 olafnosuke.hatenablog.com