邁克爾答案非常接近,但這裏是有效的例子。
我已經在單元測試中使用Mockito,所以我對庫很熟悉。然而,與我以前使用Mockito的經歷不同,簡單地嘲笑返回結果並沒有幫助。我需要做兩件事來測試所有的用例:
- 修改存儲在StreamResult中的值。
- 拋出SoapFaultClientException。
首先,我需要認識到,我不能用Mockito模擬WebServiceTemplate,因爲它是一個具體的類(如果這是必需的,您需要使用EasyMock)。幸運的是,對Web服務sendSourceAndReceiveToResult的調用是WebServiceOperations接口的一部分。這需要對我的代碼進行更改,以期望WebServiceOperations與WebServiceTemplate相對。
以下代碼支持其中一個結果是在StreamResult參數返回的第一用例:
private WebServiceOperations getMockWebServiceOperations(final String resultXml)
{
WebServiceOperations mockObj = Mockito.mock(WebServiceOperations.class);
doAnswer(new Answer()
{
public Object answer(InvocationOnMock invocation)
{
try
{
Object[] args = invocation.getArguments();
StreamResult result = (StreamResult)args[2];
Writer output = result.getWriter();
output.write(resultXml);
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
}).when(mockObj).sendSourceAndReceiveToResult(anyString(), any(StreamSource.class), any(StreamResult.class));
return mockObj;
}
用於第二使用情況下的支撐是相似的,但需要一個異常的投擲。以下代碼創建一個包含faultString的SoapFaultClientException。在faultcode是我測試的代碼處理Web服務請求使用:
private WebServiceOperations getMockWebServiceOperations(final String faultString)
{
WebServiceOperations mockObj = Mockito.mock(WebServiceOperations.class);
SoapFault soapFault = Mockito.mock(SoapFault.class);
when(soapFault.getFaultStringOrReason()).thenReturn(faultString);
SoapBody soapBody = Mockito.mock(SoapBody.class);
when(soapBody.getFault()).thenReturn(soapFault);
SoapMessage soapMsg = Mockito.mock(SoapMessage.class);
when(soapMsg.getSoapBody()).thenReturn(soapBody);
doThrow(new SoapFaultClientException(soapMsg)).when(mockObj).sendSourceAndReceiveToResult(anyString(), any(StreamSource.class), any(StreamResult.class));
return mockObj;
}
更多的代碼可能需要這兩種使用情況,但他們爲我的目的工作。
Mockito +1。 – CoverosGene 2009-04-27 20:06:30