簡體   English   中英

JUnit4預期異常

[英]JUnit4 expected exception

我正在使用JUnit4為項目進行場景測試。

在其中一個測試中,我需要檢查預期的異常。 使用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);
}

第二次測試失敗了。

考慮:

@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

JUnit4的行為與預期一致:拋出異常時,執行不會繼續。 因此拋出NullPointerException ,測試方法退出,JUnit4將其標記為傳遞,因為您預期會發生異常。 null解除引用后的代碼實際上不存在。

如果你想要第二次測試的行為,那么你所寫的是一個很好的解決方案。 但這是一件奇怪的事情。 在我看來,你正在混淆兩種不同的測試。 一個測試應該測試在特殊情況下拋出異常。 第二個測試應測試第二個斷言檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM