2

私はJUnitを学び始めたばかりです。この答えを他の場所で探してみましたが、見つかりませんでした。次のような例外を予期するJUnitテストメソッドを作成するとします。(数学は私が作成したクラスのインスタンスです)

 @Test(expected = NumberFormatException.class)
    public void testAdd_String() {
        System.out.println("testing add number to string");
        double result = math.add("lakd", "2");
    }

ここで、テストしたいメソッドについて:

public double add(String operand1, String operand2) {
    int num1 = Integer.parseInt(operand1);
    int num2 = Integer.parseInt(operand2);
    return num1 + num2;
}

throws NumberFormatExceptionメソッドヘッダーがある場合とない場合の両方で、テストに合格します。これは予想される動作ですか、それともJUnitですか?JUnitテストを介して、throws句がメソッドに存在することを確認する方法はありますか?

4

1 に答える 1

2

メソッド宣言に追加throwsするのは、「ほら、いつでもこの例外をスローできます!準備しておくとよいでしょう」という警告ラベルです。throwステートメントを使用する場合、または呼び出すメソッドがステートメントを使用する場合にのみ、実際に例外をスローしますthrow

NumberFormatException実行時例外またはチェックされていない例外(のサブクラスRuntimeException)であるため、を使用するメソッドで宣言する必要はありませんthrows。それでもtry/catchブロックでキャッチできますが、チェックされた例外(FileNotFoundExceptionのサブクラスであるなどException)とは異なり、スローするためにメソッドで宣言する必要はありません。

メソッドがスローできるチェック済み例外があることをテストする必要はありません。実際に例外をスローするかどうかだけです。実際、すでにお持ちのように、のexpectedパラメーターは、行を次のように変更した場合など、メソッドがのスロー@Testを停止した場合にテストが失敗することを意味します。NumberFormatException

double result = math.add("1", "2");

メソッドを使用する誰かがそれを囲むtry/catchブロックを持たなければならないほど例外が「予期される」と感じる場合は、独自のサブクラスを作成する必要があります。ただしException、これにより、メソッドをクリーンに使用することがより困難になる可能性があることに注意してください。 。

于 2012-10-16T01:20:27.963 に答える