2013-08-14 29 views
5

例外の束をスローする関数のテストケースを記述すると、テストメソッドでこれらの例外のスロー宣言を追加する必要があります。個々の例外をキャッチします。それについて正しい方法は何ですか?私はtry-catchが良い方法だと信じていますが、catchブロックではstacktraceを出力しますか?jUnitテストケースは、スロー宣言またはtry catchブロックでデフォルト例外を処理する必要があります

例えば、getGroups(String name)というメソッドがあり、AuthenticationExceptionがスローされます。 nameパラメータがnullのときにIllegalArgumentExceptionがスローされているかどうかを確認するテストケースを作成すると、AuthenticationExceptionはどのように処理されますか?私はそれを私のメソッドの一部をスローするために追加しますか?または、例外をtry-catchブロックで囲む必要があります。上記のテストケースで

@Test 
public void testGetGroupsWithNull() throws AuthenticationException { 
thrown.expect(IllegalArgumentException.class); 
getGroups(null); 
} 

私はちょうどthrows AuthenticationExceptionを追加しましたが、私はtry-catchブロックで例外を囲むために優れていると何shoudld私は例外をキャッチした後に行うかどうかを知りたいです。私はスタックトレースを印刷することができました。

予期しない例外AuthenticationExceptionを 'throws'句に入れないでtry/catchブロックに配置することで処理しています。

@Test 
public void testGetGroupsWithNull() { 
thrown.expect(IllegalArgumentException.class); 
try { 
    getGroups(null); 
} catch(AuthenticationExcption e) { 
    Assert.fail("Authentication Exception"); 
} 
} 
+0

私の回答があなたを助けたり、あなたの質問を解決しましたか? –

答えて

5

ここではJUnitの記事はhttps://github.com/junit-team/junit/wiki/Exception-testingです。 あなたは行うことができます。

@Test(expected= IndexOutOfBoundsException.class) 
public void empty() { 
    new ArrayList<Object>().get(0); 
} 

か:

@Test 
    public void testExceptionMessage() { 
     try { 
      new ArrayList<Object>().get(0); 
      fail("Expected an IndexOutOfBoundsException to be thrown"); 
     } catch (IndexOutOfBoundsException anIndexOutOfBoundsException) { 
      assertThat(anIndexOutOfBoundsException.getMessage(), is("Index: 0, Size: 0")); 
     } 
    } 
1

の注釈がよりコミュニケーションです。

は、読者にコードを読ませることなく、が実行されることを予期します。

いずれの単一テストでも、1つの例外をスローする必要があります。各テストは、単一の動作をテストする必要があるためです。 1つの動作では1つの例外しかスローできません。

他の例外がスローされた場合は、テストに失敗します。テストメソッドのシグネチャは、同じメソッドを呼び出すrealコードのように、チェックされている可能性のある例外を反映する必要があります。

4

JUnitテストで予期しない例外がスローされた場合、そのテストは失敗します。それがあなたが望む行動です。したがって、try/catchブロックを使用することは今までのところありません。例外が予想される場合は、コードスニペットから明らかにわかっているExpectedExceptionルールを使用します。しかし、あなたが1つかどうかを期待しているかどうか、try/catchを使用しないでください。

これは、例外が検査例外である場合、throws節が必要であることを意味します。実際には、例外がスローされることを期待していないときでも、テストによって例外がスローされる例外をスローすることができるという理由だけで、テストメソッドにthrows節が必要になることがよくあります。私はすべての単一のテスト方法にthrows Exceptionと書くという習慣を持っています。そうしなければならない理由はありません。それは心配することが1つ少ないことです。

+0

私はちょうどあなたが言っていることを理解していることを確認したい。この特定の場合、または一般に 'AuthenticationException'がチェックされた例外であるため、メソッドの 'throws'節に例外を追加する必要があります。 try/catchブロックでこの例外を処理するべきではありません。なぜなら、 'AuthenticationException'がスローされたとしてもテストケースが合格になるからです。 – user12222

+1

この特定のケースでは、例外を処理する場合、 'ExpectedException'ルールを使って例外を処理するだけでなく、テストは失敗します。 'ExpectedException'ルールは、例外が本当にスローされ、捕らえられないことを確認するためのものです。したがって、このテストメソッドでtry/catchを使用しないでください。そうしないと、失敗します。そして、一般的に、ANYテストメソッドではtry/catchを使用しないでください。なぜなら、これは必要ないからです。テストにノイズが追加されるだけです。 –

+0

私は今少し混乱しています。しかし、予期しない例外が発生したときにJUnitテストが失敗するという動作であったとは言いませんでした。したがって、メソッドのthrows節に 'AuthenticationException'を追加すると、予期しない例外がスローされてもテストケースは成功します。一方、try/catchブロックで予期しない例外を処理し、予期しない例外がスローされるようにテストメソッドを強制すると、テストは失敗します。 – user12222

1

問題を解決するために可能な限り小さなコードを書くルールを使用すると、最初のコードスニペットが勝ちます。だから、AuthenticationExceptionをテストメソッドのthrows節に入れてください。より簡潔で読みやすい。

0

私はあなたの話題を扱っているので、私は単なる同じ質問を探しています。単体テストのベストプラクティスに関する良い説明が見つかりました。記事から少し抜粋するとあなたを助けることができます。

JUnitフレームワークが状況を処理するため、テストに失敗する場合にのみ存在する独自のキャッチブロックを記述する必要はありません。たとえば、次の方法のユニットテストを書いているとします

final class Foo { 
    int foo(int i) throws IOException; 
} 

ここでは、整数を受け入れ、整数を返し、それはエラーが発生した場合はIOExceptionをスローするメソッドを持っています。ここでは7を通過したときにメソッドが3を返すことを確認してユニットテストを書くための間違った方法は次のとおりです。

// Don't do this - it's not necessary to write the try/catch! 
@Test 
public void foo_seven() 
{ 
    try 
    { 
    assertEquals(3, new Foo().foo(7)); 
    } 
    catch (final IOException e) 
    { 
    fail(); 
    } 
} 

テスト対象の方法は、それがチェック例外でIOExceptionが、投げることができることを指定します。したがって、例外をキャッチしないか、テストメソッドが例外を伝播できることを宣言しない限り、単体テストはコンパイルされません。

// Do this instead 
@Test 
public void foo_seven() throws Exception 
{ 
    assertEquals(3, new Foo().foo(7)); 
} 

は、我々はテストメソッドが例外をスローするのではなくIOExceptionがスローすることを宣言します。それは短く、より焦点を絞ったテストにつながるため、2番目の選択肢が好ましいです。 JUnitフレームワークは、テスト中のメソッドの呼び出し中に例外が発生した場合、このテストが失敗することを確認します。独自の例外処理を記述する必要はありません。

あなたは、この記事では上記のようなJUnitのベストプラクティスについての詳細を見つけることができます。 http://www.kyleblaney.com/junit-best-practices/

希望を支援します。

関連する問題