2017-08-24 48 views
1

我有以下類 在StackOverflow中有對此的回答,但它涉及列表throw checked Exceptions from mocks with Mockito。我喜歡研究這種情況。沒有得到我失蹤的地方。檢查的異常對此方法無效

public SimpleClass{ 
     private SimpleClass(){} 
     public void runMethod(request,String,Map,Object,Object){ 
      try{ 
        doesSomething().... 
       } 
     } 
     catch(Exception e){ 
      String message= ""+request.getAttribute(X)+"Some message" 
       Logger.Log(param1+param2+message); 
      } 

     } 

我的測試方法如下所示。我試圖用JUnit運行覆蓋範圍,但沒有涉及Catch Block,因此請編寫下面的測試方法。它拋出下面的異常。無法找到我失蹤的地方。

public class SimpleClassTest{ 
     @Test 
     public void testCatchBlock(){ 
      SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class); 
      Mockito.doThrow(new Exception()).when(instanceObj).runMethod(request, anyString(), anyMap(), anyObject(), anyObject()); 
     } 
    } 

拋出異常

org.mockito.exceptions.base.MockitoException: 
    Checked exception is invalid for this method! 
    Invalid: java.lang.Exception 

編輯

我能夠運行給予NullPointerException異常的方法。當我嘗試使用Junit進行代碼覆蓋時,catch塊完全顯示爲紅色,並且catch字句顯示爲黃色。我如何實現100%的覆蓋率以及如何測試catch塊中的String消息。

+0

我試圖做到這一點,但無法得到我想念的東西。 – Sawyer

+0

@Sawyer代碼片段不完整,但我建議再看看你的存根。 – Brice

+0

我無法實現Catch塊中字符串的覆蓋和測試。我怎麼做。 – Sawyer

回答

3

你正在通過模擬錯誤進行單元測試。在這裏:

SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class); 

在嘲笑的類,它是測試沒有點!

當你模擬這個類,你會得到一個存根有「無關」你真正的實現。 「工作設置」看起來更像是:

public void methodUnderTest(X x, ...) { 
    try { 
    x.foo(); 
    } catch (Exception e) { 
    ... 
} 

X mockedX = mock(X.class); 
when(x.foo()).thenThrow(new WhateverException()); 

underTest.methodUnderTest(mockedX); ... 

,然後你可以嘗試驗證例如,該記錄器鋸的預期日誌調用。換句話說:你要麼使用模擬允許你的代碼在測試下做它的工作(用在控制中!)或驗證有些預期的調用發生在模擬對象上。

但正如所說:嘲笑那個你想測試的類沒有任何意義。因爲一個嘲弄的對象不瞭解任何有關「真正的」實現的知識!

+0

這要看。進一步討論這個話題的冗長的很好。 – GhostCat

+0

如何驗證漁獲物的內容,請給我一個提示? – Sawyer

+1

這取決於。如果Logger.log()是一個**靜態**調用,你可以使用PowerMock(ito)或JMockit來驗證日誌調用是否發生。我個人不喜歡嘲笑靜態調用,或者,您可以:將某個日誌接口的*實例*作爲成員放入該生產類中。然後:你可以使用* dependency injection *來提供一個** mocked **記錄器對象。您可以再次*驗證*電話。好的...那又過了5分鐘;-) – GhostCat

0

操作環境,以便「doesSomething()」引發您想要的異常。因爲我們不知道什麼「doesSomething()」真的不能說更多。