Camel Spring 启动 CXF 端点测试
Camel Spring Boot CXF endpoint testing
我有以下端点和路线。
@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();
}
}
但在这种情况下我有以下错误:
Caused by: java.net.ConnectException: ConnectException invoking
http://myurl: Connection refused (Connection refused)
这是符合逻辑的,我没有运行申请。
然后我尝试将 cxf 端点替换为模拟:
MockEndpoint mockEndpoint = getMockEndpoint("mock:cxf:bean:requestEndpoint");
producerTemplate.sendBody(mockEndpoint, bodyForRoute1);
我得到了
Asserting: mock://direct:route1 is satisfied - FAILED
和异常 (java.lang.AssertionError: mock://direct:route1 接收到的消息计数。预期:<1> 但实际为:<0>
), 因为我的路由代码没有被调用。
如何正确测试路由?我想尝试两种有趣的方式:
1) 使用真实的 http 端点进行测试(这允许您测试请求的早期阶段 - 例如 - 具有无效 xml 的请求)
2) POJO payload在消息体中时的隔离测试
如果能解决我的问题,我将不胜感激
你问题中的路由测试使用了Camel test kit。这是为您的 Camel 路线做 "unit tests" 的好工具,即您的问题中的 #2。
在这些测试中,您通常使用 AdviceWith 来 将真实端点替换为模拟,因为您想要测试消息的正确路由 。
查看@Bedlas 评论中的链接答案,将您的 CXF 端点替换为直接端点以使您的测试正常进行。
如果您想使用真实端点进行测试,即您的问题中的#1,您应该考虑使用像Citrus 这样的集成测试框架。
使用此类框架,您可以针对应用程序的 运行 实例编写测试。在您的情况下,您将针对 运行 应用程序的真实 CXF 端点发送 HTTP 或 SOAP 请求,并且您有很多可能性来验证结果(检查 JMS 队列、数据库条目等),具体取决于您的应用程序的作用。
我有以下端点和路线。
@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();
}
}
但在这种情况下我有以下错误:
Caused by: java.net.ConnectException: ConnectException invoking http://myurl: Connection refused (Connection refused)
这是符合逻辑的,我没有运行申请。
然后我尝试将 cxf 端点替换为模拟:
MockEndpoint mockEndpoint = getMockEndpoint("mock:cxf:bean:requestEndpoint");
producerTemplate.sendBody(mockEndpoint, bodyForRoute1);
我得到了
Asserting: mock://direct:route1 is satisfied - FAILED
和异常 (java.lang.AssertionError: mock://direct:route1 接收到的消息计数。预期:<1> 但实际为:<0> ), 因为我的路由代码没有被调用。
如何正确测试路由?我想尝试两种有趣的方式:
1) 使用真实的 http 端点进行测试(这允许您测试请求的早期阶段 - 例如 - 具有无效 xml 的请求)
2) POJO payload在消息体中时的隔离测试
如果能解决我的问题,我将不胜感激
你问题中的路由测试使用了Camel test kit。这是为您的 Camel 路线做 "unit tests" 的好工具,即您的问题中的 #2。
在这些测试中,您通常使用 AdviceWith 来 将真实端点替换为模拟,因为您想要测试消息的正确路由 。
查看@Bedlas 评论中的链接答案,将您的 CXF 端点替换为直接端点以使您的测试正常进行。
如果您想使用真实端点进行测试,即您的问题中的#1,您应该考虑使用像Citrus 这样的集成测试框架。
使用此类框架,您可以针对应用程序的 运行 实例编写测试。在您的情况下,您将针对 运行 应用程序的真实 CXF 端点发送 HTTP 或 SOAP 请求,并且您有很多可能性来验证结果(检查 JMS 队列、数据库条目等),具体取决于您的应用程序的作用。