Apache уже отвечает за такие требования к тестированию.Существует конструкция adviceWith , которая решит эту проблему.
Цитирование примера напрямую с несколькими изменениями по ссылке, указанной выше:
@Test
public void testAdvised() throws Exception {
context.addRoutes(new RouteBuilder() {
@Override public void configure() throws Exception {
from("direct:start").id("my-route").to("mock:foo");
}
});
context.getRouteDefinition("my-route").adviceWith(context, new RouteBuilder() {
@Override
public void configure() throws Exception {
// intercept sending to mock:foo and do something else
interceptSendToEndpoint("mock:foo")
.skipSendToOriginalEndpoint()
.to("log:foo")
.to("mock:result");
}
});
getMockEndpoint("mock:foo").expectedMessageCount(0);
getMockEndpoint("mock:result").expectedMessageCount(1);
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
}
Теперь здесь определен маршруткак: from("direct:start").id("my-route").to("mock:foo");
И, скажем, мы хотим высмеять здесь часть to
.
Это именно то, что я и делаю:
context.getRouteDefinition("my-route").adviceWith(context, new RouteBuilder() {
@Override
public void configure() throws Exception {
// intercept sending to mock:foo and do something else
interceptSendToEndpoint("mock:foo")
.skipSendToOriginalEndpoint()
.to("log:foo")
.to("mock:result");
}
});
Мы получаемссылка на определение маршрута, которую мы хотим изменить из CamelContext, и используя метод adviceWithith, мы можем определить, какие действия нужно выполнить.Как и здесь, я посоветовал не отправлять в фактический пункт назначения, т.е. mock:foo
, а отправлять по двум другим маршрутам log:foo
и mock:result
.
Надеюсь, он отвечает на ваш запрос.