これ僕.com:行動分析学マニアがおくる行動戦略

意図と行動のギャップから生じる「不自由さ」への挑戦。果たして僕たちに自由はあるのか?

JUnit4で遊んでみる

ふと、そういやJUnit4ってどうなったんだっけ?と思い出し、SourceForgeを漁ってダウンロードしてみた。で、簡単に遊んでみました。

JUnit4を使ったテストクラス

import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

public class HogeTest {

    private Hoge hoge;
    
    @Before
    public void Hogeインスタンスの生成() {
        hoge = new Hoge();
    }
    
    @After
    public void 後始末() {
        hoge = null;
        System.gc();
    }
    
    @Test
    public void 加算() {
        assertEquals(3, hoge.add(1, 2));
    }
    
    @Test(expected=hoge.HogeException.class)
    public void 例外が発生すること() throws Exception {
        hoge.exception();
    }
    
    @Test
    public void 配列の比較() {
        assertEquals(new String[] {"aaa", "bbb", "ccc"}, hoge.createArray());
    }
    
    @Test
    @Ignore(value="テストを無視することができるらしい")
    public void 無視してみる() {
        assertEquals("aaa", "bbb");
    }
}
実行方法

JUnitCoreというクラスを実行するらしい。Eclipseから実行したので間違ってるかもしれないけど、多分こんな感じ。

% java org.junit.runner.JUnitCore hoge.HogeTest

JUnit version 4.0
...I
Time: 0

OK (3 tests)
TestCaseを継承しなくていいらしい

TestCaseクラスを継承してなくてもJUnitCoreさんがテストを実行してくれます。TestCaseクラスを継承してなくてもstatic importを使えば、assertEqualsできます。ぐーっど。

import static org.junit.Assert.assertEquals;
(途中略)
public class HogeTest {
@Testアノテーション

テストメソッドは"test"からはじめなくても良いらしい。その代わり、@Testアノテーションをつける必要がありますが。個人的には、これはまー、悪くはないかなって程度の印象。

    @Test
    public void 加算() {
        assertEquals(3, hoge.add(1, 2));
    }

でも、@Testアノテーションで例外のテストができるのは素晴らしい。シンプル!

    @Test(expected=hoge.HogeException.class)
    public void 例外が発生すること() throws Exception {
        hoge.exception();
    }
@Beforeアノテーションと@Afterアノテーション

setUp()とtearDown()の代わりに@Beforeアノテーションと@Afterアノテーションが使える。

    @Before
    public void Hogeインスタンスの生成() {
        hoge = new Hoge();
    }
    
    @After
    public void 後始末() {
        hoge = null;
        System.gc();
    }

ちなみにこいつらは複数個指定することができて面白い。

    @Before
    public void hoge1() {...}
    
    @Before
    public void hoge2() {...}
    
    @Before
    public void hoge3() {...}
@BeforeClassアノテーションと@AfterClassアノテーション

何気にこいつが一番うれしい。クラスレベルのsetUp()とtearDown()みたいなものです。従来のsetUp()とtearDown()だと、テストメソッドの前後に実行されるので、毎回やる必要のない処理もあったりして辛いことも。@BeforeClassアノテーションを使えば、一度しかやんなくて良い処理を自然に記述できそうで嬉しい。で、上に記述しているテストクラスに以下のコードを追加して実行してみました。

    @BeforeClass
    public static void クラスレベルの初期化() {
        System.out.println("クラスの初期化");
    }
    
    @AfterClass
    public static void クラスレベルの後始末() {
        System.out.println("クラスの後始末");
    }

実行結果は以下の通り。

JUnit version 4.0
クラスの初期化
...Iクラスの後始末

Time: 0

OK (3 tests)
@Ignoreアノテーション

@Ignoreをつけると、そのテストは無視されるらしい。JUnitCoreを実行したコンソール上には"I"という文字が表示されました。未実装だけど、忘れないようにテストは書いておきたいって場合に便利かな。

    @Test
    @Ignore(value="テストを無視することができるらしい")
    public void 無視してみる() {
        assertEquals("aaa", "bbb");
    }
配列の比較

assertEqualsが配列の中身まで比較してくれるようになりました。いい事だ。

    @Test
    public void 配列の比較() {
        assertEquals(new String[] {"aaa", "bbb", "ccc"}, hoge.createArray());
    }
感想

Eclipseでグリーンバーやレッドバーを出してくれるプラグイン、ほしいな〜。コンソールは何だか味気ない。