我有一个Apache Camel的rest端点来查找来自不同来源的一些值,首先我验证请求,然后根据路径转到不同的路由:
restConfiguration()
.component("servlet")
.bindingMode(RestBindingMode.json)
...
rest("/lookup/{path}")
.consumes(MediaType.APPLICATION_JSON_VALUE)
.produces(MediaType.APPLICATION_JSON_VALUE)
.post().type(LookupRequest.class).outType(LookupResponse.class)
.to("direct:validate-request")
from("direct:validate-request")
.routeId(Constants.ROUTE_VALIDATE_REQUEST)
.to("bean-validator://x")
.process(exchange ->
exchange.getIn().setHeader("lookupType", env.getProperty("lookup.path." + exchange.getIn().getHeader("path", String.class)))
)
.to("bean:lookupValidationService?method=validate(${body}, ${header.lookupType})")
.toD("direct:db-lookup-${header.lookupType}");
from("direct:db-lookup-customer")
.routeId(Constants.ROUTE_CUSTOMER_LOOKUP)
.log(LoggingLevel.DEBUG, CamelRouter.CAMEL_BODY)
...
.to("sql:{{lookup.queries.customer}}?placeholder=~&usePlaceholder=true")
.process(new SqlQueryResultProcessor())
...
.endRest();
这是我测试路线的一次尝试:
@ActiveProfiles("test")
@CamelSpringBootTest
@SpringBootTest(classes = LookupServiceApplication.class)
@MockEndpointsAndSkip("log:.*")
@UseAdviceWith
class CameltestingApplicationTests {
@Autowired CamelContext camelContext;
@Autowired ProducerTemplate producerTemplate;
@EndpointInject("mock:direct:db-lookup-customer")
MockEndpoint customerMock;
static List<Map<String, Object>> results = new ArrayList<Map<String, Object>>() {{
add(new HashMap<String, Object>() {{
put("customerName", "Test customer");
}});
}};
@BeforeEach
public void before() throws Exception {
camelContext.setTracing(true);
AdviceWith.adviceWith(camelContext, Constants.ROUTE_CUSTOMER_LOOKUP, routeBuilder -> {
routeBuilder.interceptSendToEndpoint("sql:*").skipSendToOriginalEndpoint().process(e -> e.getIn().setBody(results));
});
}
@Test
public void testReceive() throws Exception {
camelContext.start();
// Expect:
customerMock.expectedMessageCount(1);
// And: the process to set the header
customerMock.expectedHeaderReceived("lookupType", "customer.info");
Map<String, Object> headers = new HashMap<>();
headers.put("path", "customer.info");
Map<String, Object> keywords = new HashMap<>();
keywords.put("customerNumber", 1234678);
LookupRequest request = new LookupRequest();
request.setKeywords(keywords);
// When we send the message
producerTemplate.sendBodyAndHeaders("direct:validate-request", request, headers);
// Everything is satisfied.
Assert.assertNotNull(camelContext.hasEndpoint("direct:db-lookup-customer"));
customerMock.assertIsSatisfied();
}
}
这是日志:
2021-07-12 12:10:13.604 INFO 660 --- [ main] o.a.c.i.e.AbstractCamelContext : Apache Camel 3.11.0 (Lookup service) started in 1s246ms (build:160ms init:1s7ms start:79ms)
2021-07-12 12:10:13.623 INFO 660 --- [ main] o.a.c.Tracing : *--> [validate ] [from[direct:validate-request] ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.624 INFO 660 --- [ main] o.a.c.Tracing : [validate ] [bean-validator://x ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.727 INFO 660 --- [ main] o.a.c.Tracing : [validate ] [Processor@0x166ddfb7 ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.728 INFO 660 --- [ main] o.a.c.Tracing : [validate ] [bean:lookupValidationService?meth] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.733 INFO 660 --- [ main] o.a.c.Tracing : [validate ] [direct:db-lookup-${header.lookupT] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.739 INFO 660 --- [ main] o.a.c.Tracing : ---> [customer ] [from[direct:db-lookup-customer] ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.740 INFO 660 --- [ main] o.a.c.Tracing : [customer ] [log ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.740 INFO 660 --- [ main] o.a.c.Tracing : [customer ] [setHeader[customerNumber] ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.891 INFO 660 --- [ main] o.a.c.Tracing : [customer ] [sql:{{lookup.queries.customer}}?p] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.892 INFO 660 --- [ main] o.a.c.Tracing : [customer ] [Processor@0x1feb586d ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupRequest, Body: LookupRequest(keywords={customerNumber=1234678})]
2021-07-12 12:10:13.895 INFO 660 --- [ main] o.a.c.Tracing : [customer ] [Processor@0x34695b23 ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: null, Body: [{customerName=Test customer}]]
2021-07-12 12:10:13.896 INFO 660 --- [ main] o.a.c.Tracing : [customer ] [log ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupResponse, Body: LookupResponse(ok=true, errorMessage=null, results=[{customerName=Test customer}])]
2021-07-12 12:10:13.896 INFO 660 --- [ main] o.a.c.Tracing : <--- [customer ] [from[direct://db-lookup-customer]] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupResponse, Body: LookupResponse(ok=true, errorMessage=null, results=[{customerName=Test customer}])]
2021-07-12 12:10:13.897 INFO 660 --- [ main] o.a.c.Tracing : *<-- [validate ] [from[direct://validate-request] ] Exchange[Id: 32F8D8FB9A7CF84-0000000000000000, BodyType: com.odfl.freight.lookupservice.model.LookupResponse, Body: LookupResponse(ok=true, errorMessage=null, results=[{customerName=Test customer}])]
2021-07-12 12:10:13.900 INFO 660 --- [ main] o.a.c.c.m.MockEndpoint : Asserting: mock://direct:db-lookup-customer is satisfied
...
java.lang.AssertionError: mock://direct:db-lookup-customer Received message count 0, expected at least 1
at org.apache.camel.component.mock.MockEndpoint.fail(MockEndpoint.java:1790)
at org.apache.camel.component.mock.MockEndpoint.assertTrue(MockEndpoint.java:1773)
我是测试ApacheCamel路由的新手,请有人帮助我了解问题出在哪里,或者如何验证输出,因为您可以看到交换对象主体已经存在并通过了。我已经尝试了一些方法来模拟这个端点,但似乎什么都不起作用,我没有主意了。
您用@MockEndpointsAndSkip("log:.*")
只模拟了log
端点,并且将customerMock
注入为mock:direct:db-lookup-customer
,但如果它不在路由中,它如何接收消息
我认为您所需要的只是以某种方式模拟您的direct:db-lookup-customer
,例如在adviceWith
中或使用注释