こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

JUnitテストの@Beforeと@Afterを使う

こんにちは。「Javaを復習する初心者」です。今回はJUnitテストの@Beforeアノテーションと@Afterアノテーションを使ってみました。

JUnit4.4では@Beforeアノテーション、@Afterアノテーションを使うことができます。メソッドに@Before・@Afterアノテーションを付与すると、そのメソッドはテストメソッド実施の前・後に実行されます。

テストするクラス

今回テストするクラスは以下のStudentクラスです。

public class Student {

    private String id;
    private int subject1;
    private int subject2;
    private int subject3;
    private int subject4;
    private int subject5;

    public Student(String id, int subject1, int subject2, int subject3, int subject4, int subject5) {
        this.id = id;
        this.subject1 = subject1;
        this.subject2 = subject2;
        this.subject3 = subject3;
        this.subject4 = subject4;
        this.subject5 = subject5;
    }

    public boolean isPass() {

        double avg = (double)(subject1 + subject2 + subject3 + subject4 + subject5) / 5.0;
        return avg >= 50;

    }

	-以下getter/setter-

}

生徒の成績を扱うイメージのクラスです。5教科の点数をフィールドに持ちます。isPass()メソッドで合否を返却します。trueの場合は合格です。5教科の点数の平均が50以上なら合格という設定にしました。

テストケース

さて、このisPass()メソッドをテストしようと思います。テストケースは以下の通りです。

case 教科1 教科2 教科3 教科4 教科5 期待値
No. 1 50 50 50 50 50 true
No. 2 49 50 50 50 50 false
No. 3 50 49 50 50 50 false
No. 4 50 50 49 50 50 false
No. 5 50 50 50 49 50 false
No. 6 50 50 50 50 49 false

上記の6パターンを作りました。No. 1ではすべての科目が50点なので期待値がtrueです。No. 2から6はどれか一つが49で他は50点なのでfalseです。このテストをする場合、最初にコンストラクタですべての科目を50にして、適宜変更な必要な科目のみをsetterメソッドで変更するのが簡潔だと思います。そのため、テストクラスにStudentクラス型変数を定義しておいて、@Beforeアノテーションでインスタンスを生成して格納するやり方がよさそうです。

@Afterアノテーションについては今回は動作を確認するのみにしました。コンソールに5つの科目の点数を出力するのみにしました。

以下が作成したテストケースと結果です。

public class StudentTest {

    Student student;

    @Before
    public void setup() {
        student = new Student("01", 50, 50, 50, 50, 50);
    }

    @Test
    public void test1() {
        assertThat(student.isPass(), is(true));
    }

    @Test
    public void test2() {
        student.setSubject1(49);
        assertThat(student.isPass(), is(false));
    }

    @Test
    public void test3() {
        student.setSubject2(49);
        assertThat(student.isPass(), is(false));
    }

    @Test
    public void test4() {
        student.setSubject3(49);
        assertThat(student.isPass(), is(false));
    }

    @Test
    public void test5() {
        student.setSubject4(49);
        assertThat(student.isPass(), is(false));
    }

    @Test
    public void test6() {
        student.setSubject5(49);
        assertThat(student.isPass(), is(false));
    }

    @After
    public void tearDown() {
        System.out.printf("%d %d %d %d %d",
                student.getSubject1(),
                student.getSubject2(),
                student.getSubject3(),
                student.getSubject4(),
                student.getSubject5());
        System.out.println();
    }

}
50 50 50 50 50
49 50 50 50 50
50 49 50 50 50
50 50 49 50 50
50 50 50 49 50
50 50 50 50 49

setup()メソッドで変数studentに新しくインスタンスを格納しています。このとき、すべての科目の点数を50点に設定しています。テストケース2からはsetterメソッドを呼び出して、一つの科目だけ49点に設定しています。

結果では、テストケース2から点数が49点の科目が一つだけ設定されているのが分かります。