Ответ Майкла очень близок, но вот пример, который работает.
Я уже использую Mockito для своих модульных тестов, поэтому я знаком с библиотекой. Однако, в отличие от моего предыдущего опыта с Mockito, просто издевательство над возвращаемым результатом не помогает. Мне нужно сделать две вещи, чтобы проверить все варианты использования:
- Изменить значение, хранящееся в StreamResult.
- Создайте исключение SoapFaultClientException.
Во-первых, мне нужно было понять, что я не могу смоделировать WebServiceTemplate с Mockito, поскольку это конкретный класс (вам нужно использовать EasyMock, если это необходимо). К счастью, вызов веб-службы 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;
}
Поддержка второго варианта использования аналогична, но требует исключения. Следующий код создает исключение SoapFaultClientException, которое содержит faultString. Код неисправности используется кодом, который я тестирую и который обрабатывает запрос веб-службы:
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;
}
Для обоих этих вариантов использования может потребоваться больше кода, но они работают для моих целей.