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(); で接続を切って制御するしかない