Как проверить, правильно ли обрабатывается ошибка SOAP?
Я использую JUnit и Mockito для проверки того, что мой веб-сервис SOAP корректно обрабатывает ошибки SOAP и не генерирует, например, нежелательные исключения.
Итак, до сих пор, как вы можете видеть из приведенного ниже кода, я проверяю только SOAPFaultException
бросается (конечно, я бросил его). Интересно, как я мог проверить, возникнет ли какое-либо другое исключение при получении ошибки SOAP.
Также есть ли способ смоделировать ошибку SOAP без выдачи исключения (SOAPFaultException
)?
public class SOAPFaultsTest {
private MyObj myObj = (MyObj) mock(IMockClass.class);
@Before
public void create() {
SOAPFault soapFault = null;
try {
soapFault = SOAPFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL).createFault();
soapFault.setFaultString("unable to create new native thread");
soapFault.setFaultCode(QName.valueOf("soap:Server"));
} catch (SOAPException e) {
e.printStackTrace();
}
// Define behaviour of myObj mock object
when(myObj.randomMethod(any(RandomClass.class))).thenThrow(new SOAPFaultException(soapFault));
}
// Here I'm testing whether invoking myObj's randomMethod with a RandomClass object as an argument throws a SOAPFaultException.
// It does because this is how I defined its behaviour.
// What I really want to test is whether receiving a SOAP fault at any time is going to cause any trouble.
@Test(expected=SOAPFaultException.class)
public void testSOAPException() throws SOAPFaultException {
RandomClass rc = new RandomClass();
myObj.randomMethod(rc);
}
}
1 ответ
Я предлагаю вам использовать макет с полным стеком (т.е. создать конечную точку в локальном сокете, указать клиенту там). Тогда создайте ошибку мыла и позвольте макету выбросить соответствующее исключение по проводу. Если вы используете CXF, я создал простое правило JUnit, которое делает это, см. Тестовый метод SoapServiceRuleTest.processSoapCallWithException ().
В качестве общей стратегии я предлагаю вам сделать абстрактный модульный тест "счастливый случай", который вы саботируете по одному вызову за раз, выполняя сброс макета с каждым методом теста и добавляя thenThrow(..) соответственно.