如何使用Mockito测试SOAP消息?

我对Mockito相当陌生,并且认为我会尝试使用它来测试SOAP处理程序。 然而,这比我预期/想要的要痛苦得多。

我期待验证我的处理程序能够提取SOAPMessage标题中的messageID。 但是,从处理程序中,唯一可以通过上下文/消息/部分/信封/头部转到头部的方法。 使用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));
    }
}

就像我说的那样,它可以工作,但它看起来像一个非常丑陋/重量级的解决方案。

无论如何要做到这一点更容易/更清洁?

谢谢!

埃里克


    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;

有点晚了,但我更喜欢产生代表mockito模拟的工作端点。 这可以让我测试整个堆栈,包括拦截器和/或处理程序,这对您的使用情况应该会有所帮助。

我已经提出了一个简单的JUnit规则,它在这里稍微简化了一些事情。 由此产生的测试用例应该小而干净。 我建议直接从XML文件加载测试XML响应,因为这更快,更容易维护。


不要嘲笑这样的事情。

听代码...它告诉你,这不是正确的做法。

相反,只需创建一个包含一些已知数据的(真实)消息,并声明您的代码与它做了正确的事情。

例如

MessageIdExtractor extractor = new MessageIdExtractor(); // < - 您正在测试的课程

字符串expectedMessageId =“xxxxxx”;

消息m = new SOAPMessage().setMessageId(expectedMessageId);

assertThat(extractor.extractIdFrom(m),equalTo(expectedMessageId));

链接地址: http://www.djcxy.com/p/57547.html

上一篇: How to use Mockito to test SOAP messages?

下一篇: Is there any drag and drop CSS based layout generation tool?