8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

開発力強化Advent Calendar 2022

Day 13

ログ出力(slf4j)の単体テスト

Posted at

はじめに

slf4jを使用したログ出力メソッドを実装した際に単体テストを書く必要があり、少し詰まったのでまとめておきます
Spring Boot + junit5 + mockito

概要

  • テスト対象クラスのサンプルコード
  • テストメソッドのサンプルコード
  • テストメソッドの補足

テスト対象クラス

INFOログを出力するような簡単なサンプル

public class LogService{
  public void output() {
    Logger logger = LoggerFactory.getLogger(getClass());
    logger.info("hoge");
  }
}

テストクラス

  // 引数検証の為のArgumentCaptor、LoggingEventを検証する
  @Captor
  private ArgumentCaptor<LoggingEvent> captorLoggingEvent;

  // モック化されたAppender
  @Mock
  private Appender<ILoggingEvent> mockAppender;

  @Test
  void test() {
    // テスト対象のクラス名を設定
    Logger logger = (Logger) LoggerFactory.getLogger(LogService.class);
    // loggerのログ出力先をモック化する
    logger.addAppender(mockAppender);

    // テスト対象クラスの呼出
    targetService.outputStart();

    // 呼び出し回数の検証,引数の取得
    verify(mockAppender, times(1)).doAppend(captorLoggingEvent.capture());
    // ログレベルの検証
    assertThat(captorLoggingEvent.getValue().getLevel().toString(), is("INFO"));
    // 出力メッセージの検証
    assertThat(captorLoggingEvent.getValue().getMessage(), is("hoge"));
  }

テストクラスの補足

ArgumentCaptorの定義。
モック化したメソッドに渡される引数を検証する際に用いる。

  @Captor
  private ArgumentCaptor<LoggingEvent> captorLoggingEvent;

Appenderはログの出力先の設定を行うために使用されるインターフェース。

  @Mock
  private Appender<ILoggingEvent> mockAppender;

getLoggerの引数にテスト対象のクラス名を指定する
addAppender()メソッドでloggerのログ出力先をモックにするする。

    Logger logger = (Logger) LoggerFactory.getLogger(LogService.class);
    logger.addAppender(mockAppender);

verifyメソッドにより、モック化したメソッド(ログ出力)が何回呼び出されたかを検証。
またキャプラーで引数を取得し、アサーションを行う。

    verify(mockAppender, times(1)).doAppend(captorLoggingEvent.capture());
    assertThat(captorLoggingEvent.getValue().getLevel().toString(), is("INFO"));
    assertThat(captorLoggingEvent.getValue().getMessage(), is("hoge"));
8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?