LoginSignup
8
4

More than 5 years have passed since last update.

[Java][Spring] ロガーの挙動をテストする

Posted at

要求

  • JUNITのテストでロガーの実行(loggher.warn()されたかなど)を確認したい

手法

  • テスト対象クラスのロガーインスタンスをモックと入れ替える
  • ArgumentCaptor を使えるようにする
  • verfy メソッドを使ってロガーモックインスタンスの指定メソッドのコールをキャッチし、引数に渡されたものをキャプチャする

サンプル

対象クラス

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class Sample {
  private Logger logger = LoggerFactory.getLogger(Sample.class);

  public void run() {
    logger.info("サンプルメッセージ");
  }
}

テストクラス

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;


class SampleTest {
  private Sample sample = new Sample();

  // ロガー確認用 渡される引数をキャプチャする
  @Captor
  ArgumentCaptor<String> logMessageCaptor;

  @Mock
  private Logger mockLogger;

  @BeforeEach
  public void setUp(){
    MockitoAnnotations.initMocks(this); //これを実行することで、テスト対象クラスのフィールド変数をモックと入れ替えられる。
  }

  @Test
  void testRun() {
    sample.run();
    verify(mockLogger, times(1)).info(logMessageCaptor.capture()); //ここでロガーのinfo実行回数を確認しつつ、引数をキャプチャしてる
    assertEquals("サンプルメッセージ", logMessageCaptor.getValue());
  }
}

verify について

  • これ自体も assertEquals() のように、正しさの検証を兼ねる
    • 確認するメソッド指定を正しく指定すること
      • 主語
      • メソッド
      • 引数
    • 想定される実行回数を正しく指定すること
      • times(n) の n の値
      • 実行されないべきであるときは0を指定する
  • 引数に Captor を使うことで、渡された値を取り出せる
8
4
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
4