1

我有以下端点和路线。

  @Bean
  public CxfEndpoint requestEndpoint() {
    CxfEndpoint endpoint = new CxfEndpoint();
    endpoint.setAddress(SERVICE_ADDRESS);
    endpoint.setServiceClass(Service.class);
    endpoint.setWsdlURL(WSDL_LOCATION);
    endpoint.setBus(bus);
    endpoint.setProperties(endpointProperties);
    return endpoint;
  }

from("cxf:bean:requestEndpoint")
  //Custom logic with various outbound routes 
  .choice()
  ....

  .to("direct:route1")

  ....

  .to("direct:route2") 

我想测试一下。各种输入数据应路由到各种路由。

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
@MockEndpoints
@Configuration
public class RequestRouteTest extends CamelTestSupport {

  @Autowired
  private ProducerTemplate producerTemplate;


  @EndpointInject(uri = "mock:direct:route1")
  private MockEndpoint mockCamel;


  @Test
  public void myTest() throws Exception {
    mockCamel.expectedMessageCount(1);

    producerTemplate.sendBody("cxf:bean:requestEndpoint", bodyForRoute1);

    mockCamel.assertIsSatisfied();
  }

} 

但在这种情况下,我有以下错误:

引起:java.net.ConnectException:ConnectException 调用 http://myurl:连接被拒绝(连接被拒绝)

这是合乎逻辑的,我没有运行该应用程序。

然后我尝试替换 cxf 端点来模拟:

MockEndpoint mockEndpoint = getMockEndpoint("mock:cxf:bean:requestEndpoint");
producerTemplate.sendBody(mockEndpoint, bodyForRoute1);

我得到了

断言:mock://direct:route1 满足 - 失败

和异常(java.lang.AssertionError: mock://direct:route1 Received message count. Expected: <1> but was: <0> ),因为我的路由代码没有被调用。

如何正确测试路线?我想尝试两种有趣的方式:

1) 使用真实的 http 端点进行测试(这允许您测试请求的早期阶段 - 例如 - 带有无效 xml 的请求)

2)POJO有效负载在消息体中时的隔离测试。

如果我的问题有解决方案,我将不胜感激

4

1 回答 1

1

您问题中的路线测试使用Camel 测试套件。这是为你的骆驼路线做“单元测试”的一个很好的工具,即你的问题的#2。

在这些测试中,您通常使用AdviceWith真实端点替换为模拟,因为您想测试消息的正确路由

请参阅@Bedlas 评论中的链接答案,用直接端点替换您的 CXF 端点,以使您的测试正常工作。

如果您想使用真实的端点进行测试,即您的问题中的#1,您应该考虑使用像Citrus这样的集成测试框架。

使用这样的框架,您可以针对正在运行的应用程序实例编写测试。在您的情况下,您将针对正在运行的应用程序的真实 CXF 端点发送 HTTP 或 SOAP 请求,并且您有很多可能性来验证结果(检查 JMS 队列、数据库条目等),具体取决于您的应用程序所做的事情。

于 2018-06-12T06:40:08.490 回答