要求
- 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 を使うことで、渡された値を取り出せる