В то время как вы можете использовать перехваты и советы, чтобы поменять конечные точки в соответствии с Клаусом Ибсеном
ответьте, я думаю, что гораздо лучше разрешить вашим маршрутам принимать Endpoint
экземпляры, чтобы ваши тесты не были связаны с вашими URI конечной точки производства.
Например, скажем, у вас есть RouteBuilder
, который выглядит как
public class MyRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("http://someapi/someresource")
.process(exchange -> {
// Do stuff with exchange
})
.to("activemq:somequeue");
}
}
Вы можете сделать возможным ввод конечных точек следующим образом:
public class MyRoute extends RouteBuilder {
private Endpoint in;
private Endpoint out;
// This is the constructor your production code can call
public MyRoute(CamelContext context) {
this.in = context.getEndpoint("http://someapi/someresource");
this.out = context.getEndpoint("activemq:somequeue");
}
// This is the constructor your test can call, although it would be fine
// to use in production too
public MyRoute(Endpoint in, Endpoint out) {
this.in = in;
this.out = out;
}
@Override
public void configure() throws Exception {
from(this.in)
.process(exchange -> {
// Do stuff with exchange
})
.to(this.out);
}
}
Который затем можно проверить следующим образом:
public class MyRouteTest {
private Endpoint in;
private MockEndpoint out;
private ProducerTemplate producer;
@Before
public void setup() {
CamelContext context = new DefaultCamelContext();
this.in = context.getEndpoint("direct:in");
this.out = context.getEndpoint("mock:direct:out", MockEndpoint.class);
this.producer = context.createProducerTemplate();
this.producer.setDefaultEndpoint(this.in);
RouteBuilder myRoute = new MyRoute(this.in, this.out);
context.addRoutes(myRoute);
context.start();
}
@Test
public void test() throws Exception {
this.producer.sendBody("Hello, world!");
this.out.expectedMessageCount(1);
this.out.assertIsSatisfied();
}
}
Это имеет следующие преимущества:
- ваш тест очень прост и легок для понимания, и ему даже не нужно расширять
CamelTestSupport
или другие вспомогательные классы
-
CamelContext
создается вручную, поэтому вы можете быть уверены, что создается только тестируемый маршрут
- тест не заботится об идентификаторах URI производственного маршрута
- у вас все еще есть удобство жесткого кодирования URI конечной точки в классе маршрута, если вы хотите