【问题标题】:Mock spring integration outbound web service call模拟 spring 集成出站 Web 服务调用
【发布时间】:2016-09-21 03:10:47
【问题描述】:

我有一个带有出站soap web服务调用的spring集成项目。

我有一个集成测试用例,用于测试项目的输入和输出,其中输入从活动 mq 队列中读取并将输出发送到数据库列。

写入数据库的这个值由 SOAP Web 服务返回。

下面是网络服务调用

 <int:chain id="soapcall" input-channel="soapChannel"> 
  <int:service-activator ref="convertData" />  
  <int-ws:outbound-gateway  uri="${url}" 

  </int-ws:outbound-gateway>
 </int:chain> 

如何避免调用实际的实时网络服务,而是模拟网络服务调用并返回静态响应?

【问题讨论】:

    标签: java spring web-services mocking spring-integration


    【解决方案1】:

    给链和网关id属性:

    <int:chain id="soapcall" input-channel="soapChannel"> 
        <int:service-activator ref="convertData" />  
        <int-ws:outbound-gateway id="wsgw" uri="${url}" 
    
        </int-ws:outbound-gateway>
    </int:chain> 
    

    然后您可以使用AbstractWebServiceOutboundGateway@Qualifier("soapcall$child.wsgw.handler") @Autowire 您的测试。

    那么,在你的测试中,setMessageSender(myMockWebServiceMessageSender)

    【讨论】:

      【解决方案2】:

      感谢 Gary 的 answer 和此示例 here

      使用 Spring Boot 和 Mockito,我能够使用静态响应模拟 soap 出站网关:

      @SpringBootTest
      @RunWith(SpringRunner.class)
      public class SoapGatewayTest {
      
          private static final String XML_REPONSE = "<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\"><S:Body>"
                  // enrich your answer here
                  // ...
                  + "</S:Body></S:Envelope>";
      
          @Autowired
          @Qualifier("soapcall$child.wsgw.handler")
          private AbstractWebServiceOutboundGateway simpleWebServiceOutboundGateway;
      
          @Mock
          private WebServiceMessageSender messageSender;
      
          @Mock
          private WebServiceConnection wsConnection;
      
          @Test
          public void myMethodTest() {
              // mocking the WS SOAP gateway
              when(this.messageSender.createConnection(any(URI.class))).thenReturn(this.wsConnection);
              when(this.messageSender.supports(any(URI.class))).thenReturn(true);
      
              // the gateway will always respond with a static response
              doAnswer(new Answer<WebServiceMessage>() {
                  public WebServiceMessage answer(InvocationOnMock invocation) throws InvalidXmlException, IOException {
                      WebServiceMessageFactory factory = invocation.getArgumentAt(0, WebServiceMessageFactory.class);
                      return factory.createWebServiceMessage(new ByteArrayInputStream(XML_REPONSE.getBytes()));
                  }
              }).when(this.wsConnection).receive(any(WebServiceMessageFactory.class));
      
              this.simpleWebServiceOutboundGateway.setMessageSender(this.messageSender);
      
              // run the code to be tested here
              // ...
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        相关资源
        最近更新 更多