LoginSignup
19
21

More than 5 years have passed since last update.

JUnitでLoggerの出力内容をテスト

Posted at

きっかけ

外部コマンドを実行するなど、副作用の結果を取得しづらいときは、ログの挙動で期待する結果かどうかを判定したくなります。あるいは、ログ出力されるかどうかをテストしたいというときもあり、調べたり試行錯誤してみました。

コンストラクタインジェクションを使うやり方

mockのLoggerインスタンスを差し込めるようにするという、一番シンプルなやり方です。今のところはこのやり方に落ち着いています。

サンプルコード

Sample.java

public class Sample {

  private Logger logger;

  public Sample() {
     this.logger = LoggerFactory.getLogger(this.getClass());
  }

  public Sample(Logger logger) {
     this.logger = logger;
  }

  public void apply() {

     try {
       /* 中略 */
       logger.info("success") 
     } catch (Exeception e) {
       logger.error("failed!", e); 
     }

  } 


}
SampleTest.java

public class SampleTest {

   @Captor
   ArgumentCaptor<String> messageCaptor;

   @Captor
   ArgumentCaptor<Exception> exceptionCaptor;

   @Mock
   Logger logger;

   Sample sample;

   @Before
   public void init() {
      MockitoAnnotations.initMocks(this);

      sample = new Sample(logger); 
   } 

   @Test
   public void test() {
       /* 例外が出るように準備 */
       sample.apply(); 

       verify(logger, times(1)).error(messageCaptor.capture(), execptionCaptor.capture());

       assertThat(messageCaptor.getValue()).isEqualTo("failed!");
       assertThat(execptionCaptor.getValue()).isNotNull();
   }




}

appenderをモックにするやり方

slf4jやlogbackであれば、appenderをモックにするやり方があるようです。

参考サイト

19
21
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
19
21