web-dev-qa-db-ja.com

JUnit 4の予期される例外タイプ

私は他の誰かが書いたコードでJUnitテストをしようとしていますが、例外には型が欠けているように見えるので、例外をテストする方法を理解できません。

public Pirate(String name, int initialGold) throws Exception {
    if(initialGold < 0)
        throw new Exception("Init Gold must be >= 0");
    this.name = name;
    this.numGold = initialGold;
    this.health = Pirate.DEFAULT_HEALTH;
    this.isCursed = false;
}

私のJUnitコードスニペット:

@Test
public static void constructorTest() throws Exception{
    rodgers = new Pirate("Dread Pirate Rodgers", 10000);
    assertEquals("Dread Pirate Rodgers" , rodgers.getName());
    assertEquals(10000, rodgers.getNumGold());
    assertEquals(100, rodgers.getHealth());
    assertEquals(false, rodgers.getIsCursed());
}

@Test()
public static void exceptionTest() throws Exception{
    rodgers = new Pirate("Dread Pirate Rodgers" , -100);

}

Testの括弧にexpected =(ある種の例外)を入れる必要があることは知っていますが、例外の種類についてはわかりません。

34

RuleExpectedException を使用して、JUnit 4.7の@Test(expected=Xyz.class)に代わるものが実際にあります

テストケースでは、_@Rule_アノテーションが付けられたExpectedExceptionを宣言し、ExpectedException.none()のデフォルト値を割り当てます。次に、例外を予期するテストで、値を実際の期待値に置き換えます。これの利点は、いtry/catchメソッドを使用せずに、例外内のメッセージが何であったかをさらに指定できることです。

_@Rule public ExpectedException thrown= ExpectedException.none();

@Test
public void myTest() {
    thrown.expect( Exception.class );
    thrown.expectMessage("Init Gold must be >= 0");

    rodgers = new Pirate("Dread Pirate Rodgers" , -100);
}
_

このメソッドを使用すると、一般的な例外のメッセージが特定のものであるかどうかをテストできる場合があります。

[〜#〜] addition [〜#〜]ExpectedExceptionを使用するもう1つの利点は、例外内の例外をより正確にスコープできることです。テストケースのコンテキスト。テストで@Test(expected=Xyz.class)アノテーションのみを使用している場合、Xyz例外は、テストコード内の任意の場所(テストメソッド内のテストセットアップまたは事前アサートを含む)にスローできます。これにより、誤検知が発生する可能性があります。

ExpectedExceptionを使用すると、テスト中のメソッドを実際に呼び出す直前に、セットアップと事前アサートが完了するまでthrown.expect(Xyz.class)の指定を延期できます。したがって、テストフィクスチャ自体ではなく、実際のメソッド呼び出しによってスローされる例外をより正確にスコープします。

JUnit 5注:

JUnit 5 JUnit Jupiterは、@Test(expected=...)、_@Rule_、およびExpectedExceptionをすべて削除しました。これらは新しい assertThrows() に置き換えられ、Java 8およびラムダ構文を使用する必要があります。ExpectedExceptionは引き続き使用可能です。また、JUnit Jupiterは、 junit-jupiter-migrationsupport module を使用してJUnit 4 ExpectedExceptionを引き続きサポートしますが、追加する場合のみ _@EnableRuleMigrationSupport_ のクラスレベルの注釈。

106
Kevin Welker

expected@ Testアノテーションorは、明示的なcatchブロックを提供し、プログラムフローが期待どおりでない場合、failを発行します。

@Test(expected=Exception.class) // Java.lang.Exception
public static void exceptionTest() throws Exception {
    rodgers = new Pirate("Dread Pirate Rodgers" , -100);
}

@Test
public static void exceptionTest() throws Exception {
    try {
        rodgers = new Pirate("Dread Pirate Rodgers" , -100);
        fail("should not reach this");
    } catch(Exception e) {
        // ok
    }
}

私の個人的な好みが最初の解決策です。

20
Steve Oh

JUnit 'expected'を使用して、例外をテストできます。

@Test(expected = ExceptionYouWishToTestFor.class)  
public void divisionWithException() {  
    // Test Code
}

その後、コードで特定の例外をスローするかどうかはあなた次第です。

9
Michael W

金がゼロ以上でない場合、Exceptionをスローしません。 IllegalArgumentExceptionをスローします。確かに、あなたのPirateがマイナスの金を持っていることは違法であるように聞こえます。

public Pirate(String name, int initialGold) {
    if(initialGold < 0)
        throw new IllegalArgumentException("Init Gold must be >= 0");

次に、JUnitテストケースで、IllegalArgumentExceptionを期待します。

@Test(expected=IllegalArgumentException.class)
public static void exceptionTest() {
7
rgettman