2

私は本当にJUnitとユニットテスト全般の初心者であり、正しいアプローチを見つけるのに苦労しています。予期しない例外に対処するためのより良い方法は何ですか? またその理由は何ですか?

方法 A:

  1. 最初に期待されるものをキャッチし、メッセージでテストに失敗します
  2. 最後の catch ブロックで、一般的な例外をキャッチし、「予期しない例外が発生しました」というメッセージでテストに失敗します

方法 B:

  1. 期待されるものだけをキャッチし、メッセージで失敗します
  2. テストメソッドを でマークし、throws Exception予期しない「バブルアップ」をテストから完全に除外します

さらに混乱を招くのは、「予期しない例外」と言うのは、次のいずれかを意味することです。

  1. テストされているメソッドがスローすると主張する例外ですが、この場合はオンです。たとえば、私のメソッドは IllegalArgumentException と NullPointerException をスローしますが、この try ブロックでは IllegalArgument; をスローすると予想しています。NullPointer は予期しないものと見なされます。キャッチして失敗するか、バブルアップしますか?
  2. 私が本当に予想できない一般的な例外

私はこの質問が少し混乱していることを認識しています.私自身も迷子になっています. 反対票を投じてもあなたを責めることはありませんが、それでもリスクを負う価値はあります:)

4

5 に答える 5

3

JUnitのテストメソッドでは、基本的にメソッドがエラーなく終了すれば、JUnitはテストをパスしたと見なします。したがって、あなたがすべきことは、到着するはずのすべての例外をキャッチすることです。その場合、次のことができます。

@Test
public myMethodToTest()
{
    try {
        /* ... */
        /* error should trigger before the following statement : */
        fail("Reason");
    } catch(GoodException e) { } 
   // no need to do anything since you expected that error
   // You can let the test ends without further statement 
}

それを書く別の方法があります:

@Test (expected=IndexOutOfBoundsException.class)
public void elementAt()
{
    int[] intArray = new int[10];

    int i = intArray[20]; // Should throw IndexOutOfBoundsException
}

それでも必要な場合は、トリガーしてはならない例外をキャッチして、次のようなことを行うことができます。

@Test
public myMethodToTest()
{
    try {
        /* ... */
    } catch(BadException e) {
        fail("Reason");
    }

}
于 2013-05-12T14:08:48.997 に答える
1

メソッドを UNIT テストするという考えは、それが信頼できるメソッドであることを確認することです。信頼性とは、特定の入力に対して、出力が常に期待どおりであることを意味します。したがって、例外があるかどうかは、メソッドから何が期待されるかによって異なります。予期しない例外が発生し、メソッドがそれに対して何もしないと思われる場合は、テスト ケースを PASSED としてマークできます。ただし、メソッドが例外シナリオを処理することが期待されていて、それができない場合は、テスト ケースを FAILED としてマークします。

于 2013-05-12T14:04:24.760 に答える