2015-06-04 74 views
1

我有Spring引導應用程序。我使用Junit + Mockito進行單元測試。所有的測試用例都是用Java編寫的。我最近決定使用Groovy編寫測試用例,儘管應用程序代碼將保留在Java中。Junit使用groovy預期的例外

我在測試預期的異常時遇到了一個奇怪的場景。

方案1:試驗預期的異常使用JUnit + Groovy的(無shouldFail):

@Test(expected = NoResultException.class) 
    void testFetchAllNoResultsReturned() throws Exception { 
     List<Name> namesLocal = null; 
     when(Service.fetchAllNames(id)).thenThrow(
       new NoResultException("")) 
     namesLocal = (service.fetchAllNames(id) 
     assert(namesLocal==null) 
     verify(service, times(1)).fetchAllNames(id) 
    } 

按照上面的測試情況下,service.fetchAllNames呼叫應該丟一個NoResultException。這方面的測試似乎運作良好。然而,斷言驗證之後,不被稱爲。只要遇到異常,方法執行就會停止。不過,我之前用Java編寫的測試案例工作得很好。這個問題只有在我切換到Groovy後纔會發生。

做了一些谷歌搜索後,我發現有一個叫shouldFail由可用於這種情況下按本link的GroovyTestCase類提供的方法。它確實解決了我的問題。

情景2:測試預期的異常使用JUnit +的Groovy(帶shouldFail):

@Test 
    void testFetchAllNoResultsReturned() throws Exception { 
     List<Name> namesLocal = null; 
     when(Service.fetchAllNames(id)).thenThrow(
       new NoResultException("")) 
     shouldFail(NoResultException.class) { 
      namesLocal = (Service.fetchAllNames(id) 
     } 
     assert(namesLocal==null) 
     verify(Service, times(1)).fetchAllNames(id) 
    } 

我的疑問是,這是它是如何工作的還是我失去了一些東西。如果這是它應該如何工作的,Groovy是否有這樣的理由?我試圖在互聯網上尋找原因,但我無法獲得許多線索。

回答

2

但是,之後的斷言和驗證不被調用。只要遇到異常,方法執行就會停止。不過,我之前用Java編寫的測試案例工作得很好。

鑑於這種代碼在java中:不管你有什麼service.fetchAllNames(id)

@Test(expected = NoResultException.class) 
void testFetchAllNoResultsReturned() throws Exception { 
    List<Name> namesLocal = null; 
    when(Service.fetchAllNames(id)).thenThrow(
      new NoResultException("")) 
    namesLocal = (service.fetchAllNames(id) 
    .... 
} 

,呼叫將拋出一個異常,測試例結束那裏。既然你有一個預期的異常定義,測試用例就會通過。所以在這行代碼之後的斷言和驗證從未在java中執行。

我不熟悉groovy,但從文檔中看起來像使用shouldFail的第二個示例是測試groovy中異常的正確方法。 shouldFail不終止程序 - 所以它類似於把你的方法調用在try catch中java

+0

請注意,在OP的第二個片段中不需要'namesLocal'字段 – NamshubWriter