4

メソッドの 1 つの Java ユニット テストを作成しています。メソッドの宣言は次のようになります。

public int convertToInteger() throws InvalidRomanNumberException
{
    int result=0;
    BaseRomanNumeral num1, num2; 
    int i=0;
    if(!validOperation())
        throw new InvalidRomanNumberException();
}

現在、2 つの単体テストを作成しようとしています。1 つは、正しい例外がスローされるかどうかをテストすることです。もう 1 つは、書き込み変換が確実に行われるようにすることです。これが私のテストケースの外観です

@Test
public void testRomanNumberConversion() {
    String romanValue="MCMII";
    RomanNumber num=new RomanNumber(romanValue);
    assertEquals(1903,num.convertToInteger());  
}

@Test(expected = InvalidRomanNumberException.class)
public void testInvalidRomanNumberExceptionThrown()  {
    String romanValue="MCMIIII";
    RomanNumber num=new RomanNumber(romanValue);
    num.convertToInteger(); 
}

これらの両方のテスト ケースで、Unhandled InvalidRomanNumberException というエラーが発生します。これは、各メソッド定義にスロー InvalidRomanNumberException を追加した場合にのみ解決されます。しかし、それは正しい方法ではないと思います。他の人に確認したいのですが、ここでの標準は何ですか? この未処理の例外メッセージを解決するにはどうすればよいですか

4

2 に答える 2

5

チェックされた例外のように見えるので、でInvalidRomanNumberException囲むかtry-catch、メソッドを宣言する必要がありthrows InvalidRomanNumberExceptionます。JUnitそうでなくても、これが標準です。

そうは言っても、expectスローするテストケースメソッドは、テストケースが失敗するため、 a でそれを抑制する意味がないため、InvalidRomanNumberException理想的にはそれを宣言する必要があります。一方、例外がスローされないと予想されるテスト ケース メソッドは、メソッドの周りにを使用できます。また、例外がスローされるかどうかに関係なく、このテスト ケースには、メソッドからの期待される結果が含まれている必要があります。throwstry-catchtry-catchconvertToIntegerassertconvertToInteger

JUnit テスト ケースの最終結果は、テストが成功したか失敗したかである必要があります。実行時の例外はどちらも示しません。JUnit テスト ケースはクラッシュしてはなりません。

于 2015-05-01T08:24:58.213 に答える
4

これは、チェックされた例外ではなく、チェックされていない例外であるべきだと感じています。

この 2 つの違いを思い出してください。チェック済み例外は、欠落したファイルや不正な URL など、合理的に回復可能なものを意味します。チェックされていない/実行時の例外は、ゼロ除算のように、回復不可能なものであることを意味します。

ユーザーが無効なローマ数字を入力した場合、回復して再試行できると言うのは意味がないかもしれません -変換レイヤーはそれに対して責任を負うべきではありません。インスタンス化時に物事を決定する必要があるように思えます。

代わりにカスタム例外を extendsRuntimeExceptionにすると、それをスローするように宣言する必要がなくなり (また、宣言しても何の効果もありません)、テストでそれを処理する必要がなくなります。

別の方法は、代わりにテストでスローされるように宣言することです。これには、これらの例外をチェックしたままにしておくことができるという利点があり、潜在的な例外がキャッチされなかったりスローされなかったりすることでテストが不平を言うことがないようにすることができます。

@Test
public void testRomanNumberConversion() throws InvalidRomanNumberException {
    String romanValue = "MCMII";
    RomanNumber num = new RomanNumber(romanValue);
    assertEquals(1903, num.convertToInteger());  
}

@Test(expected = InvalidRomanNumberException.class)
public void testInvalidRomanNumberExceptionThrown() throws InvalidRomanNumberException {
    String romanValue = "MCMIIII";
    RomanNumber num = new RomanNumber(romanValue);
    num.convertToInteger(); 
}
于 2015-05-01T08:38:08.507 に答える