3

プロジェクトの JUnit4 でシナリオ テストを作成しています。

テストの 1 つで、予想される例外をチェックする必要があります。JUnit4 では、アノテーションを使用してこれを行います。

 @Test(expected=...) 

問題は、例外をスローするテストのコードの下に、実行されないことを確認する必要がある他の注釈があることです。与えられた例:

   @Test(expected=NullPointerException.class)
     public void nullPointerTest() {
         Object o = null;
         o.toString();
         assertTrue(false);
     }

このテストは nullpointerexception を取得するため合格しますが、明らかに asserTrue(false) でアサーション エラーが発生するため、失敗させたいと考えています。

これを修正する最善の方法は何ですか? これに対する解決策は次のとおりですが、これが正しい方法であるかどうかはわかりません。

@Test
public void nullPointerTest2() {
    boolean caught = false;
    try{
        Object o = null;
        o.toString();
    }
    catch(NullPointerException e)
    {
        caught = true;
    }
    assertTrue(caught);
    assertTrue(false);
}

この 2 番目のテストは、予測どおり失敗します。

4

2 に答える 2

4

検討:

@Test(expected=NullPointerException.class)
public void nullPointerTest2() {
  boolean caught = false;
  try{
     Object o = null;
     o.toString();
  }
  catch(NullPointerException e)
  {
    // test other stuff here
     throw e;
  }
}

これにより、JUnit の組み込みの例外チェックを最大限に活用しながら、追加のチェックが可能になります。

また、多くの場合、 の使用が@Rule ExpectedExceptionより良いオプションであると考えています。expected

于 2013-03-12T11:06:18.613 に答える
3

JUnit4 は期待どおりに動作しています。例外がスローされると、実行は続行されません。がスローされ、テストメソッドが終了し、例外が予想されるため、 JUnit4NullPointerExceptionはそれを合格としてマークします。null 逆参照の後のコードは事実上存在しません。

2 番目のテストの動作が必要な場合は、作成したものが適切なソリューションです。しかし、それは奇妙なことです。あなたは2つの異なるテストを混同しているように思えます。1 つのテストでは、例外的な状況下で例外がスローされることをテストする必要があります。2 番目のテストでは、2 番目のアサーションがチェックするものは何でもテストする必要があります。

于 2013-03-12T00:21:22.640 に答える