Soy bastante nuevo para Mockito, y pensé que intentaría usarlo para probar un Controlador SOAP. Sin embargo, esto está resultando ser mucho más doloroso de lo que hubiera esperado/deseado.¿Cómo usar Mockito para probar mensajes SOAP?
Estoy tratando de validar que mi controlador puede extraer el ID de mensaje en el encabezado de un SOAPMessage. Sin embargo, desde el controlador, la única manera de llegar al encabezado es a través del contexto/mensaje/parte/sobre/encabezado. Usando Mockito mi solución fue burlar mi SOAPMessage, significaba crear cada objeto individual y anular el método.
sólo puedo imaginar que hay una manera más fácil/más limpio para lograrlo:
@RunWith(MockitoJUnitRunner.class)
public class UUIDHandlerTest {
@Mock private SOAPMessage message;
@Mock private SOAPEnvelope envelope;
@Mock private SOAPHeader header;
@Mock private SOAPPart part;
@Mock
private SOAPMessageContext context;
@Before
public void setup() throws SOAPException{
when(context.getMessage()).thenReturn(message);
when(message.getSOAPPart()).thenReturn(part);
when(part.getEnvelope()).thenReturn(envelope);
when(envelope.getHeader()).thenReturn(header);
}
@Test
public void testHandleInboundMessage() {
when(context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).thenReturn(false);
when(header.getElementsByTagName(anyString())).thenAnswer(new Answer<NodeList>() {
/* (non-Javadoc)
* @see org.mockito.stubbing.Answer#answer(org.mockito.invocation.InvocationOnMock)
*/
@Override
public NodeList answer(InvocationOnMock invocation) throws Throwable {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new ByteArrayInputStream(new String("<wsa:MessageID>messageId</wsa:MessageID>").getBytes()));
// TODO Auto-generated method stub
return doc.getElementsByTagName("wsa:MessageID");
}
});
// call the test class
new UUIDHandler().handleMessage(context);
// check the MDC value
assertEquals("messageId", MDC.get(LoggerConstants.DC_PROPERTY_MESSAGE_ID));
}
}
Como he dicho, funciona, pero parece una solución muy feo peso/pesada.
¿Hay alguna forma de hacer esto más fácil/limpiador?
Gracias!
Eric
Gracias. Justo lo que estaba buscando. –
De acuerdo con los documentos, sin embargo, se debe evitar el uso de RETURN_DEEP_STUBS tanto como sea posible. En cuyo caso, supongo que la pregunta es, ¿cuál es una buena metodología para realizar este tipo de [email protected] time4tea parece indicar que tiene más sentido crear un SOAPMessage real, pero mi concepto completo de usar Mocks es evitar la necesidad de crear una estructura complicada solo para probar. Cualquier consejo sería bienvenido. –
En serio, no hagas esto. Terminará con un código que no comprende, que es muy frágil y que prueba la implementación de todo, no solo su código. Considere usar una solicitud SOAP real (si es posible construir una), o incluso crear un servidor que devuelva un bit conocido de xml, y verifique que su clase extraiga el bit de información correcto de la misma. – time4tea