きっかけ
外部コマンドを実行するなど、副作用の結果を取得しづらいときは、ログの挙動で期待する結果かどうかを判定したくなります。あるいは、ログ出力されるかどうかをテストしたいというときもあり、調べたり試行錯誤してみました。
コンストラクタインジェクションを使うやり方
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をモックにするやり方があるようです。
参考サイト