Webエンジニアのメモ帳

技術的な話を中心に書いています。

【Java】Slf4jを使って出力したログの内容をテスト

Slf4jを使って出力したログの内容を検証する方法を説明します。

なお、Sl4fjについては、以下の記事で説明しています。

http://lavapies9.com/2020/04/16/2020-04-16-101635/

テスト対象のクラス

テスト対象のクラスは以下とします。

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Sample {
  public void sampleLog() {
    log.info("sample log!");
  }
}

このクラスのインスタンスを生成し、sampleLog()メソッドを呼んだ際に、期待通りの内容がログ出力されているかテストとします。

テストクラス

テストクラスとテストメソッドは以下のようになります。

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import static org.junit.Assert.assertTrue;

public class SampleTest {
  private final ByteArrayOutputStream testErr = new ByteArrayOutputStream();
  private final PrintStream originalErr = System.err;

  @Before
  public void before() {
    System.setErr(new PrintStream(testErr));
  }

  @After
  public void after() {
    System.setErr(originalErr);
  }

  @Test
  public void テスト() {
    Sample sample = new Sample();
    sample.sampleLog();
    assertTrue(testErr.toString().contains("sample"));
  }
}

ログは標準エラーに出力されるので、テスト中だけ標準エラーの出力先を変えて、内容をチェックする、といった感じです。

テストが終わったらafter()で出力先を戻しています。

build.gradle

参考までに、build.gradleの内容を貼っておきます。

plugins {
  id 'java'
}

sourceCompatibility = 1.8

repositories {
  mavenCentral()
}

dependencies {
  compileOnly 'org.projectlombok:lombok:1.18.10'
  annotationProcessor 'org.projectlombok:lombok:1.18.10'
  implementation 'org.slf4j:slf4j-api:1.7.25'
  implementation 'org.slf4j:slf4j-simple:1.7.25'
  testImplementation 'junit:junit:4.12'
}