System.out.printとかSystem.exitとかのユニットテストを補助してくれるルールを試してみる
System.out.printlnとかSystem.exitをテストするのはちょっと面倒なのだが、その辺りを補助してくれるJUnitのルールのコレクション(System Rules)があったので試してみた。
【事前準備】
System Rulesを使うにはApache Commons IOが必要という事でダウンロードしておく。
【ユニットテストの例】
テスト対象クラスは以下のように標準出力や標準エラー出力に文字列を出力するメソッドやSystem.exit(0)を呼び出すメソッドがある。
public class MyClass { public void out() { System.out.print("Hoge"); } public void err() { System.err.print("Moge"); } public void exit() { System.exit(0); } }
上記のテスト対象クラスをSystem Rulesを使ってテストするコードは以下のようになる。かなりシンプルにテストコードが書けた。
public class MyClassTest { @Rule public final StandardOutputStreamLog stdout = new StandardOutputStreamLog(); @Rule public final StandardErrorStreamLog stderr = new StandardErrorStreamLog(); @Rule public final ExpectedSystemExit exit = ExpectedSystemExit.none(); MyClass sut; @Before public void setUp() throws Exception { sut = new MyClass(); } @Test public void testOut() { sut.out(); assertThat(stdout.getLog(), is("Hoge")); } @Test public void testErr() { sut.err(); assertThat(stderr.getLog(), is("Moge")); } @Test public void testExit() { exit.expectSystemExitWithStatus(0); sut.exit(); } }
System Rulesは上記以外にも、システムプロパティのテストを補助するProvideSystemPropertyやセキュリティーマネージャのテストを補助するProvideSecurityManagerといったルールがあるようだ。
【関連記事】