Я довольно новичок в Mockito и решил, что попробую использовать его для тестирования обработчика SOAP. Однако это оказывается гораздо более болезненным, чем я ожидал / желал.
Я хочу убедиться, что мой обработчик может извлечь messageID в заголовке сообщения SOAPMessage. Однако из обработчика единственный способ добраться до заголовка - через контекст / сообщение / часть / конверт / заголовок. Используя Mockito, я решил высмеивать мое SOAPMessage, создавая каждый отдельный объект и заглушая метод.
Я могу только представить, что есть более простой / чистый способ сделать это:
@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));
}
}
Как я уже сказал, это работает, но выглядит как очень уродливое / тяжелое решение.
Есть ли способ сделать это проще / чище?
Спасибо!
Эрик