以前に書いたログ出力のテストについての別解です。
ログ出力そのものが仕様になっている場合、ログに出力された内容に対してassertionを書きたいです。Spring Bootではそのための、JUnit5のExtensionを用意してあります。
使い方は上記のjavadocに書いてあるとおりですが、標準出力とやりとりするためのCapturedOutput
が提供されているので、テストメソッドの引数などからそれを受け取れます。
java
@ExtendWith(OutputCaptureExtension.class)
class MyTest {
@Test
void testLog(CapturedOutput output) {
// arrange
...
// act
service.apply(); // 中でログ出力している
//assert
assertThat(output).contains("done");
}
}
test/resourceにlog4j2-test.xmlを配置すれば、テストコード実行時のloggerの設定ができます。
xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="CONSOLE" />
</Root>
</Loggers>
</Configuration>
このやり方だと、loggerをdependency injectionの形にしなくてもログ出力の内容をテストできます。