2011-02-08 12 views
4

私のテスト:これはサックス後のものに下線を引いています。そして、私はtry-catchブロックを持っている....しかし、インターネットが例外をテストするための適切な方法が@Test(expected=IllegalArgumentException.class)Java:Junit4:例外テストが動作しない、try-catchブロックを主張:

@Test(expected= XMLClientNotFoind.class) 
public void testGetClientFromIP() throws XMLClientNotFound{ 
    ... 
    assertEquals(c, sax.getClientFromIP("101.0.2.01")); 
} 

および方法であることを述べていると主張し、getClientFromIPはここにある:

public Client getClientFromIP(String ip) throws XMLClientNotFound { 
     ... 
     throw new XMLClientNotFound(); 
    } 

そして、私の例外:すべての

public class XMLClientNotFound extends Exception{ 

    } 

答えて

7

まず:

@Test(expected=IllegalArgumentException.class) 

は、特にそのような一般的な例外を除いて、適切な方法と見なすべきではありません。その理由は、テストメソッドのどのステートメントが実際に例外をスローしたかを制御できないからです。

try { 
    shouldThrow() 
    fail("Expected exception"); 
} catch(XMLClientNotFound e) { 
    assertThat(e).hasMessage("Expected message"); //FEST-Assert syntax 
} 

あなたは可能性があります。また、あなたが正確に例外をスローすると仮定されている行を囲むtry-catchを使用するなどのメッセージラベル、原因、

上の任意のアサーションを作ることができないことは行くための正しい方法でありますまた、JUnit @Ruleを試してみてください。ある時間前に、私はwroteというテストをより読みやすくしています。

1

確認済みの例外に対しては、依然としてthrows句を定義する必要があります。 @Test(expected=...)の部分は、テストケースがその例外をスローすることを期待しているとJUnitは言います。

0

異なる例外をスローするテストメソッド内に他のコードがある可能性はありますか?例えば

...あなたはExceptionXを処理していないため、コンパイラは文句を言うでしょう上記の場合

@Test(expected= XMLClientNotFoind.class) 
public void testGetClientFromIP() throws XMLClientNotFound{ 

    thisMethodThrows_ExceptionX(); 

    assertEquals(c, sax.getClientFromIP("101.0.2.01")); 
} 

。 try/catchで囲むか、またはテストメソッドのシグネチャでthrows ExceptionXと言う必要があります。

一般に、テスト方法では1つのものをテストすることをお勧めします。メソッドが例外をスローすることを期待している場合、私はアサーションを理解しません。それは何も返さないので、主張するものは何もありません。

関連する問題