2017-09-07 66 views
1

我正在編寫一個JUnit測試用例,其中我得到ClassCastException。當請求對象設置實體時,我得到這個異常。 serviceRequest.setEntity((ResendDocumentsRequest)request);如何解決使用Mockito的ClassCastException?

下的測試方法

public Object invokeService(String key, Object request) { 
    if(UiIntegrationKeyConstants.RESEND_DOCUMENTS.equals(key)) { 
     ResendDocumentsServiceResponse serviceResponse = null; 

     try { 
      ESignatureClient client = (ESignatureClient) AppContext.getBean("eSignatureRestClient"); 
      ResendDocumentsServiceRequest serviceRequest = client.getResendDocumentsServiceRequest(); 
      serviceRequest.setEntity((ResendDocumentsRequest)request); 

      serviceResponse = client.resendDocuments(serviceRequest); 

     } catch (ESignatureClientException e) { 
      log.error("Exception while retrieving documents Detail "+ e.getMessage()); 
     } 
     return serviceResponse.getEntity(); 
    } 
} 

JUnit測試用例

private ResendDocumentsServiceRequest resendDocumentsServiceRequest; 
private ResendDocumentsServiceResponse resendDocumentsServiceResponse; 

@SuppressWarnings("unchecked") 
@Before 
public void setUP() { 
    mockStatic(AppContext.class); 
    esignatureClient = mock(ESignatureClient.class); 
    resendDocumentsServiceRequest = mock(ResendDocumentsServiceRequest.class); 
    resendDocumentsServiceResponse = mock(ResendDocumentsServiceResponse.class); 
} 

@Test 
public void testESignatureClientException() { 
    ESignatureServiceInvoker invoker = new ESignatureServiceInvoker(); 

    PowerMockito.when(AppContext.getBean(eq("eSignatureRestClient"))).thenReturn(esignatureClient); 
    when(esignatureClient.getResendDocumentsServiceRequest()).thenReturn(resendDocumentsServiceRequest); 
    try { 
     doThrow(new ESignatureClientException()).when(esignatureClient).resendDocuments(resendDocumentsServiceRequest); 
     resendDocumentsServiceResponse = (ResendDocumentsServiceResponse) invoker.invokeService(UiIntegrationKeyConstants.RESEND_DOCUMENTS , resendDocumentsServiceRequest); 
    } catch (ESignatureClientException ex) { 
     assertNotNull(ex); 
    } 
} 

堆棧跟蹤:

java.lang.ClassCastException: com.whatever.ResendDocumentsServiceRequest$$EnhancerByMockitoWithCGLIB$$15a76565 cannot be cast to com.whatever.ResendDocumentsRequest 
+0

您可以告訴mockito模擬其他接口,請參閱https://stackoverflow.com/questions/1170708/is-it-possible-to-create-a-mock-object-that-implements-multiple-interfaces-with –

+0

我很欣賞快速復出。有什麼我可以添加到答案也使它值得嗎? – GhostCat

回答

0

你嘲笑你的對象是ResendDocumentsServiceRequest

生產代碼需要ResendDocumentsRequest的實例。

換句話說:期望是A,提供是B.這隻有在B extends AB implements A時纔有效。從這個意義上說:這與嘲笑本身無關。但事實上,你以某種方式爲生產代碼提供了一個B對象......應該是A類型的。當你在「真正的生產運行時」也這樣做時,你會遇到同樣的錯誤。

但我們不能告訴你A)爲什麼你這樣做,B)什麼是正確的解決方案。正如你所說的那樣,這些是兩個不相連的類 - 你必須弄清楚這個失敗是否真的暴露了你的生產代碼中的一個錯誤(通過假設對象可以被這樣轉換) - 或者在你的測試設置中。

0

簡短的回答: 的resendDocumentsServiceRequest對象在你的JUnit必須擴展或實現ResendDocumentsRequest類或接口。

更多詳細信息:

  1. 創建靜態類(在JUnit測試類),這兩個擴展ResendDocumentsServiceRequest類並實現ResendDocumentsRequest接口。我會稱之爲TestKapow班。
  2. resendDocumentsServiceRequest對象的類型更改爲TestKapow
  3. 喜悅。
+0

我不確定你的解決方案。 ResendDocumentsRequest不是一個接口,我不能擴展兩個類。 – Mike

+0

如果是這種情況,代碼(目前正在編譯)將不會編譯。 ResendDocumentsServiceRequest是一個接口嗎?如果不是,請參閱本評論的第一句。 – DwB

相關問題