JUnit でログ出力を検証する。

JUnit で先日の System.setOut による標準出力先の切り替えを利用する方法である。

logger.info("AuthLogicImpl name = "+name);

このロガーが標準出力する設定になっており、このログ出力をJUnit テストコードで検証する。
準備として便利な以下を使用できるように持ってくる。
https://github.com/yipuran/yipuran-core/wiki#returnalconsumert
この ReturnalConsumer は、
文字列パターンマッチに便利なのである。

String string = // TODO 対象文字列

String name = ReturnalConsumer.of(Matcher.class).with(Matcher::find)
.get(Pattern.compile("AuthLogicImpl name = \\w+").matcher(string))
.group().replaceFirst("AuthLogicImpl name = ", "");

これで、マッチした AuthLogicImpl name の name を抽出するのである。
JUnit テストケースで使用する例、、、

private ByteArrayOutputStream bo;
@Before
public void init() {
    bo = new ByteArrayOutputStream();
    System.setOut(new PrintStream(bo));
}

@Test
public void test() {
    // TODO テスト対象メソッド呼び出し

    String resout = bo.toString();

    Arrays.stream(resout.split(System.lineSeparator()))
    .filter(s->{
        Matcher m = Pattern.compile("AuthLogicImpl name = \\w+").matcher(s);
        return m.find();
    })
    .forEach(str->{
        MatcherAssert.assertThat(ReturnalConsumer.of(Matcher.class).with(Matcher::find)
                .get(Pattern.compile("AuthLogicImpl name = \\w+").matcher(str))
                .group().replaceFirst("AuthLogicImpl name = ", "")
            , CoreMatchers.is("uranus"));
    });

}
@After
public void after() {
    System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
}

@Before と @After メソッドで、標準出力先の切り替えをしているが、
テスト対象メソッド呼び出しから、ログの検証のスコープだけで良いような気もする。

でも、この System.setOut でコンソールに出力するログを切り替えられるのは、
logback を使った時であり、log4j2 を使っているときは、ダメであった。
いったん、
org.apache.log4j.LogManager.shutdown(); で接続を切って制御するしかない