Как использовать Mockito для проверки SOAP-сообщений? - PullRequest
7 голосов
/ 16 февраля 2012

Я довольно новичок в 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));
    }
}

Как я уже сказал, это работает, но выглядит как очень уродливое / тяжелое решение.

Есть ли способ сделать это проще / чище?

Спасибо!

Эрик

Ответы [ 3 ]

4 голосов
/ 16 февраля 2012
    SOAPMessageContext context = 
            mock(SOAPMessageContext.class, RETURNS_DEEP_STUBS);
    when(context.getMessage().getSOAPPart().getEnvelope().
            getHeader().getElementsByTagName(anyString())).
            then(...);

Обратите также внимание на примечания по использованию глубоких заглушек в документации по mockito. http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#RETURNS_DEEP_STUBS

Стиль аннотации:

    @Mock(answer = Answers.RETURNS_DEEP_STUBS) SOAPMessageContext context;
1 голос
/ 29 октября 2016

Здесь немного поздно, но я предпочитаю создавать рабочую конечную точку, которая использует макет mockito.Это позволяет мне тестировать весь стек, включая перехватчики и / или обработчики, что должно быть полезно для вашего варианта использования.

Я разработал простое правило JUnit, которое несколько упрощает здесь .Результирующие тесты должны быть небольшими и чистыми.Я рекомендую загружать тестовые XML-ответы непосредственно из XML-файлов, потому что это быстрее и проще в обслуживании.

0 голосов
/ 16 февраля 2012

Не издевайтесь над такими вещами.

Послушайте код ... он говорит вам, что это неправильный способ сделать это.

Скорее, просто создайте (реальное) сообщение, содержащее некоторые известные данные, и подтвердите, что ваш код правильно с ним работает.

, например

MessageIdExtractor extractor = new MessageIdExtractor (); // <- класс, который вы тестируете </p>

String ОжидаемыйMessageId = "xxxxxx";

Сообщение m = новый SOAPMessage () .setMessageId (ОжидаемыйMessageId);

assertThat (extractor.extractIdFrom (m), equalTo (ОжидаемыйMessageId));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...