予期しない例外はテストの失敗であるため、キャッチする必要も、キャッチする必要もありません。
@Test
public void canConvertStringsToDecimals() {
String str = "1.234";
Assert.assertEquals(1.234, service.convert(str), 1.0e-4);
}
小数点が含まれているため、 untilservice
はスローされません。これは、単純なテストの失敗になります。IllegalArgumentException
str
予想される例外は、 のオプションのexpected
引数によって処理する必要があり@Test
ます。
@Test(expected=NullPointerException.class)
public void cannotConvertNulls() {
service.convert(null);
}
プログラマーが怠け者で を投げたException
場合、または をservice
返し0.0
た場合、テストは失敗します。だけNPE
が成功します。予想される例外のサブクラスも機能することに注意してください。これは s ではまれですが、 s とsNPE
では一般的です。IOException
SQLException
特定の例外メッセージをテストしたいというまれなケースでは、新しいExpectedException
JUnitを使用します@Rule
。
@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void messageIncludesErrantTemperature() {
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("-400"); // Tests that the message contains -400.
temperatureGauge.setTemperature(-400);
}
setTemperature が をスローしIAE
、メッセージにユーザーが設定しようとした温度が含まれていない限り、テストは失敗します。このルールは、より洗練された方法で使用できます。
あなたの例は、次の方法で処理するのが最適です。
private void testNumber(String word, int number)
throws OutOfRangeNumberException {
assertEquals(word, service.convert(number));
}
@Test
public final void testZero()
throws OutOfRangeNumberException {
testNumber("zero", 0);
}
インライン化できますtestNumber
。今ではあまり役に立ちません。これをパラメータ化されたテスト クラスに変換できます。