java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

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

投稿日:

最終更新日:2016年09月04日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

今回はJUnitテストの@Beforeアノテーションと@Afterアノテーションを使ってみました。

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

テストするクラス

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

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点の科目が一つだけ設定されているのが分かります。