はじめに
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"));