2010-10-06 128 views

回答

93

,我認爲它是有用的一些情況:

  • 標誌着一個測試,是不完整的,所以它失敗,並警告你,直到你可以完成它
  • 確保拋出一個異常:
try{ 
    // do stuff... 
    fail("Exception not thrown"); 
}catch(Exception e){ 
    assertTrue(e.hasSomeFlag()); 
} 

注:

由於JUnit4,有是測試一個異常被拋出一個更優雅的方式: 使用註釋@Test(expected=IndexOutOfBoundsException.class)

然而,這不會,如果你的工作還想要檢查異常,那麼你仍然需要fail()

+2

請考慮這篇博文中關於失敗vs預期註釋的相對優點:http://blog.jooq.org/2016/01/20/use-junits-expected-exceptions-sparingly/ – lbalazscs 2016-02-05 22:16:59

+0

@sleske「如果你還想要檢查異常,那麼你仍然需要失敗()「 - 不行。 ExpectedException是這樣的,請參閱https://github.com/junit-team/junit4/wiki/exception-testing – kraxor 2017-11-15 12:22:53

+0

@kraxor:真的,我在寫答案時不知道它(它可能甚至不是然後)。 – sleske 2017-11-15 22:39:57

6

我認爲通常的用例是在負面測試中沒有異常時調用它。

類似下面的僞代碼:

test_addNilThrowsNullPointerException() 
{ 
    try { 
     foo.add(NIL);      // we expect a NullPointerException here 
     fail("No NullPointerException"); // cause the test to fail if we reach this    
    } catch (NullNullPointerException e) { 
     // OK got the expected exception 
    } 
} 
+2

如果您沒有在catch塊中檢查某些內容,則可以使用@ExpectedException(NullNullPointerException.class)方法註釋來聲明您期望有一種特殊類型的異常。 – FrVaBe 2010-11-17 08:10:07

9

可以說你是爲當被測試的代碼應該拋出一個異常

try{ 
    bizMethod(badData); 
    fail(); // FAIL when no exception is thrown 
} catch (BizException e) { 
    assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR) 
} 
2

這是我如何使用失效方法的-ve流程編寫測試用例。

有你的測試用例可以在

  1. 最終順利通過三種狀態:被測試函數執行成功,返回預期
  2. 不傳遞 數據:被測函數成功執行,但不符合預期 返回的數據
  3. 失敗:該函數沒有成功執行,這是不是

意爲(與期望發生異常的負面測試案例不同) 發生)。

如果您使用的是eclipse,那麼三種狀態分別由綠色,藍色和紅色標記表示。

我對第三種情況使用失敗操作。

例如:public Integer add(integer a,Integer b){return new Integer(a.intValue()+ b。的intValue())}

  1. 傳遞情形:a =新基於整數(1)中,b =新的整數(2)和該函數返回3
  2. 不傳遞情形:a =新基於整數(1)中,b =新的整數(2)和函數返回比3
  3. 失敗案例等SOEM值:A = NULL,b = null,並且函數拋出
+0

如果你看看JUnit的源代碼,你會發現斷言使用'fail()'。 – 2016-06-02 19:42:33

6

我在的情況下使用它在那裏的東西一個NullPointerException可能在我的@Before方法中出錯了。

public Object obj; 

@Before 
public void setUp() { 
    // Do some set up 
    obj = new Object(); 
} 

@Test 
public void testObjectManipulation() { 
    if(obj == null) { 
     fail("obj should not be null"); 
    } 

    // Do some other valuable testing 
} 
+0

是的,測試前提條件很好。但是,如果您想確保'@ Before'方法成功,則最好直接在該方法中檢查它。作爲獎勵,至少JUnit和TestNG甚至會報告來自'@ Before' /'@ After'方法的錯誤的不同失敗,所以可以看到問題不在測試本身。 – sleske 2016-06-17 11:51:06

1

我舉個例子,使用fail()表明,尚未完成(它發生)的測試;否則,他們會表現出成功。

這可能是由於我不瞭解NUnit中存在的某種不完整()功能。

4

簡單地使用:

org.junit.Assert.fail("Exception expected"); 
0

最重要的使用情況很可能是異常檢查。

雖然junit4包含expected element用於檢查是否發生異常,但它好像不是新的junit5的一部分。使用fail()而不是expected的另一個優點是可以將它與finally結合使用,從而允許測試用例清理。

dao.insert(obj); 
try { 
    dao.insert(obj); 
    fail("No DuplicateKeyException thrown."); 
} catch (DuplicateKeyException e) { 
    assertEquals("Error code doesn't match", 123, e.getErrorCode()); 
} finally { 
    //cleanup 
    dao.delete(obj); 
} 

正如另一條評論所述。有一個測試失敗,直到你可以完成實施它聽起來也是合理的。