JUnitテスト予期異常

3019 ワード

次のコードを例に、canVote()メソッドがtrueまたはfalseを返すことを確認するテストを書くとともに、このメソッドが投げ出したIllegalArgumentException異常を検証するテストを書くこともできます.
public class Student {
  public boolean canVote(int age) {
      if (i<=0) throw new IllegalArgumentException("age should be +ve");
      if (i<18) return false;
      else return true;
  }
}

(Guavaクラスライブラリには、パラメータチェックを行うツールクラスであるPreconditionsクラスが提供されています.この方法では、このようなパラメータをよりよくチェックできるかもしれませんが、この例でもチェックできます).
放出された異常をチェックするには、3つの方法があります.それぞれにメリットとデメリットがあります.

1.@Test(expected…)


@Test注記にはオプションのパラメータがあり、「expected」ではThrowableのサブクラスを設定できます.上記のcanVote()メソッドが予想される異常を投げ出すことを検証したい場合は、次のように書くことができます.
@Test(expected = IllegalArgumentException.class)
public void canVote_throws_IllegalArgumentException_for_zero_age() {
    Student student = new Student();
    student.canVote(0);
}

簡単に明らかに、このテストにはいくつかの誤差があります.異常は方法のある位置で投げ出されますが、特定の行にあるとは限りません.

2.ExpectedException


JUnitフレームワークのExpectedExceptionクラスを使用する場合は、ExpectedException例外を宣言する必要があります.
@Rule
public ExpectedException thrown= ExpectedException.none();

その後、より簡単な方法で予想される異常を検証することができます.
@Test
public void canVote_throws_IllegalArgumentException_for_zero_age() {
    Student student = new Student();
    thrown.expect(NullPointerException.class);
    student.canVote(0);
}

または、予期される例外のプロパティ情報を設定できます.
@Test
public void canVote_throws_IllegalArgumentException_for_zero_age() {
    Student student = new Student();
    thrown.expect(IllegalArgumentException.class);
    thrown.expectMessage("age should be +ve");
    student.canVote(0);
}

この方法は,異常の属性情報を設定できるほか,異常が放出される位置をより正確に見つけることができるという利点がある.上記の例では、コンストラクション関数で放出される予期せぬ(unexpected)IllegalArgumentException異常がテストに失敗し、canVote()メソッドで放出されることを望んでいます.
もう一つの側面から言えば、声明を必要としないほうがいいです.
@Rule 
public ExpectedException thrown= ExpectedException.none();

不要な騒音のように、これでいいです
expect(RuntimeException.class)

または、
expect(RuntimeException.class, “Expected exception message”)

あるいは少なくとも異常と情報をパラメータとして伝達することができる
thrown.expect(IllegalArgumentException.class, “age should be +ve”);

3.Try/catch with assert/fail


JUnit 4以前のバージョンではtry/catch文ブロックを使用して例外をチェック