19

のテストを書きたいと思いIndexOutOfBoundsExceptionます。JUnit 3 を使用することになっていることに注意してください。

私のコード:

public boolean ajouter(int indice, T element) {
    if (indice < 0 || indice > (maListe.size() - 1)) {
        throw new IndexOutOfBoundsException();
    } else if (element != null && !maListe.contains(element)) {
        maListe.set(indice, element);
        return true;
    }
}

いくつかの調査の結果、JUnit 4 を使用してこれを行うことができることがわかりましたが@Test(expected = IndexOutOfBoundsException.class)、JUnit 3 でこれを行う方法はどこにもありませんでした。

JUnit 3 を使用してこれをテストするにはどうすればよいですか?

4

6 に答える 6

36

JUnit 3 で例外をテストするには、次のパターンを使用します。

try {
     ... code that should throw an exception ...

     fail( "Missing exception" );
} catch( IndexOutOfBoundsException e ) {
     assertEquals( "Expected message", e.getMessage() ); // Optionally make sure you get the correct message, too
}

fail()コードが例外をスローしない場合は、確実にエラーが発生します。

通常、例外メッセージに正しい値が表示されていることを確認したいのですが、それ@Testができないため、JUnit 4 でもこのパターンを使用します。

于 2012-11-06T14:01:35.663 に答える
15

基本的に、メソッドを呼び出して、適切な例外をスローしない場合、または他の何かをスローする場合は失敗する必要があります。

try {
  subject.ajouter(10, "foo");
  fail("Expected exception");
} catch (IndexOutOfBoundException expect) {
  // We should get here. You may assert things about the exception, if you want.
}
于 2012-11-06T14:00:55.400 に答える
4

簡単な解決策は、単体テストに try キャッチを追加し、例外がスローされない場合にテストを失敗させることです。

public void testAjouterFail() {
  try {
    ajouter(-1,null);
    JUnit.fail();
  catch (IndexOutOfBoundException()) {
    //success
  }
}
于 2012-11-06T14:01:26.417 に答える
3

@Aaron のソリューションを (静的インポート) シンタックス シュガーで拡張すると、次のように記述できます。

    expected(MyException.class,
        new Testable() {
            public void test() {
            ... do thing that's supposed to throw MyException ...
            }
        });

Testableこれは、Throwable をスローする test() シグネチャを使用する Runnable のようなものです。

public class TestHelper {
    public static void expected(Class<? extends Throwable> expectedClass, Testable testable) {
        try {
            testable.test();
            fail("Expected "+ expectedClass.getCanonicalName() +" not thrown.");
        } catch (Throwable actual) {
            assertEquals("Expected "+ expectedClass.getCanonicalName() +" to be thrown.", expectedClass, actual.getClass());
        }
    }

    interface Testable {
        public void test() throws Throwable;
    }
}

必要に応じて、例外メッセージのチェックを追加できます。

于 2015-05-14T19:39:15.650 に答える
3

できることの 1 つは、ブール値を使用してテストを完了まで実行し、次に assert を使用して例外がスローされたことを検証することです。

boolean passed = false;
try
{
    //the line that throws exception
    //i.e. illegal argument exception
    //if user tries to set the property to null:
    myObject.setProperty(null);
}
catch (IllegalArgumentException iaex)
{
    passed = true;
}
assertTrue("The blah blah blah exception was not thrown as expected"
              , passed);

このテストを使用すると、テストの実行に失敗することがなくなり、特定の種類の例外がスローされることを検証できます。

于 2014-02-04T07:55:34.447 に答える
2

テスト メソッドで、 ..ブロックajouter()内で呼び出し、その値を指定すると、例外がスローされます。trycatchindice

  • キャッチするcatchIndexOutOfBoundsException:その場合、テストメソッドから戻り、パスを示します。
  • をキャッチする 2 番目のcatchThrowable: その場合、失敗を宣言します (call fail())。間違った種類の例外がスローされたためです。
  • try..の後、例外がスローされなかったためcatch、失敗を宣言します (call )。fail()
于 2012-11-06T14:03:45.567 に答える