テス・・・ト・・・?

友人の研究室で強制されているらしいテストが面白かった。(ネタとして)*1

例えば、こんな感じのクラスがあったとする。

public class Hoge {
    private String hoge;
    public Hoge(String hoge) {
        this.hoge = hoge;
    }
    public String getHoge() {
        return hoge;
    }
    public void setHoge(String hoge) {
        this.hoge = hoge;
    }
}

この程度のクラスなら、まぁテストするほどのもんでも無いが、作るならこんな感じだろう。

@Test
public void testHoge() {
    Hoge hoge = new Hoge("a");
    assertEquals("a", hoge.getHoge());
    hoge.setHoge("b");
    assertEquals("b", hoge.getHoge());
}


だが、友人が作らされているものはこんなんじゃなかった・・・

@Test
public void testConstructor1() throws Exception {
    Hoge hoge = new Hoge("a");
    Field field = hoge.getClass().getDeclaredField("hoge");
    field.setAccessible(true);
    assertEquals("a", field.get(hoge));
}
@Test
public void testGetHoge1() throws Exception {
    Hoge hoge = new Hoge("a");
    Field field = hoge.getClass().getDeclaredField("hoge");
    field.setAccessible(true);
    assertEquals(field.get(hoge), hoge.getHoge());
}
@Test
public void testSetHoge1() throws Exception {
    Hoge hoge = new Hoge("a");
    hoge.setHoge("b");
    Field field = hoge.getClass().getDeclaredField("hoge");
    field.setAccessible(true);
    assertEquals("b", field.get(hoge));
}


見ろ!! privateフィールドがゴミのようだ!!


他にも、1つのテスト中にassertは1つだけだとか、
テストメソッド名にテスト仕様書に対応した番号を付けろだとか、*2
なんか凄いことになっているらしい・・・

*1:本人達にしてみればたまったもんじゃないだろうが。

*2:更に、テストメソッド名が対象メソッド名+番号らしく、複数メソッドに渡るテストがないとか。