java - 如何使用 Mockito 测试 SOAP 消息?

标签 java soap junit mockito

我是 Mockito 的新手,我想我会尝试用它来测试 SOAP 处理程序。然而,事实证明这比我预期/期望的要痛苦得多。

我希望验证我的处理程序是否能够提取 SOAPMessage header 中的 messageID。但是,从处理程序中,获取 header 的唯一方法是通过上下文/消息/部分/信封/ header 。使用 Mockito,我的解决方案是模拟我的 SOAPMessage,这意味着创建每个单独的对象,并 stub 该方法。

我只能想象有一种更简单/更简洁的方法来完成此任务:

@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 文档中有关使用深度 stub 的说明。 http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#RETURNS_DEEP_STUBS

注释样式:

    @Mock(answer = Answers.RETURNS_DEEP_STUBS) SOAPMessageContext context;

关于java - 如何使用 Mockito 测试 SOAP 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9301463/

相关文章:

web-services - 是否可以使用 Delphi 将 XML 发送和接收到 WSDL 函数?

unit-testing - 为什么在 JMock 中使用 .proxy()?

java - (错误位置未知): 'basePropertyType 的重复变量声明

java - 生产环境中的 JUnit 测试用例

java - 如何使用 Mockito/Powermockito 测试方法

java - 使用 Java 扫描器时条件未按预期工作

java - 我可以用什么来屏蔽字符串?

java - 访问 Shoutcast 当前流信息

java - 标准java web应用目录结构与Eclipse生成的目录结构的区别

Java Web 服务方法从 C# 客户端接收空参数