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といったルールがあるようだ。


【関連記事】