Прежде всего, большое спасибо за очень хорошо сформулированный вопрос с правильными примерами кода! Руководство по фиктивному компоненту относится к введению функции 'Пересечение существующих конечных точек' , очень вероятно, это то, что вас заблокировало. Я не очень уверен, какая версия Camel представила эту функцию.
В любом случае, чтобы обойти текущее ограничение, вы можете использовать саму автоматическую функцию c mocking. Ваш тестовый метод может быть изменен, как показано ниже, чтобы заставить его работать.
@Test
fun `exception is routed to error logging route`() {
val exchange = createExchangeWithBody("")
// Create new mock endpoint that will replace our error route
val mockEndpoint = getMockEndpoint("mock:$errorUri")
AdviceWithRouteBuilder.adviceWith(context, startUri) { routeBuilder ->
routeBuilder.mockEndpoints(errorUri)
routeBuilder.interceptSendToEndpoint(errorUri)
.skipSendToOriginalEndpoint()
.to(mockEndpoint)
}
context.start()
mockEndpoint.expectedMessageCount(1)
template.send(startUri, exchange)
assertMockEndpointsSatisfied()
}
В исходный код были внесены два изменения.
- Конечная точка макета была переименована из
mock:test
в быть в соответствии с автоматически сгенерированными типами ложных конечных точек (mock:direct:errors
) - Вызов
routeBuilder.mockEndpoints(errorUri)
, чтобы верблюд мог автоматически вводить Mocks для скороговорок, как описано в errorUri
В дополнение к этому, можно заменить блок ниже
routeBuilder.mockEndpoints(errorUri)
routeBuilder.interceptSendToEndpoint(errorUri)
.skipSendToOriginalEndpoint()
.to(mockEndpoint)
на одну строку routeBuilder.mockEndpointsAndSkip(errorUri)
, если нет особых c причин использовать intercept
, как вы упомянули в вашем вопросе.
Дополнительные наблюдения:
Запуск вашего кода без изменений четко показывает RouteReifier
перехват в конечной точке Mock, mock://test
вместо direct:errors
. Кроме того, context
, по-видимому, также имел правильный endpointStrategy
.
Это может быть ошибкой. Хотя есть и легкие альтернативы, пожалуйста, рассмотрите это как проблему и для ASF Jira .
14:32:34.307 [main] INFO org.apache.camel.reifier.RouteReifier - Adviced route before/after as XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<route xmlns="http://camel.apache.org/schema/spring" customId="true" id="direct:start">
<from uri="direct:start"/>
<onException>
<exception>java.lang.Exception</exception>
<to uri="direct:errors"/>
</onException>
<throwException/>
</route>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<route xmlns="http://camel.apache.org/schema/spring" customId="true" id="direct:start">
<from uri="direct:start"/>
<onException>
<exception>java.lang.Exception</exception>
<to uri="direct:errors"/>
</onException>
<interceptSendToEndpoint skipSendToOriginalEndpoint="true" uri="direct:errors">
<to uri="mock://test"/>
</interceptSendToEndpoint>
<throwException/>
</route>
Прохождение теста в IDE
Java реализация (если это кому-то нужно)
import org.apache.camel.Exchange;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Assert;
import org.junit.Test;
public class Camel3RouteTest extends CamelTestSupport {
private static final String startUri = "direct:start";
private static final String errorUri = "direct:errors";
private static final String mockErrorURI = "mock:"+ errorUri;
private static final String ERROR_MESSAGE = "ERROR MESSAGE!";
@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
onException(Exception.class)
.to(errorUri);
from(errorUri)
.routeId(errorUri)
.log("error happened!");
from(startUri)
.routeId(startUri)
.throwException(new Exception(ERROR_MESSAGE));
}
};
}
@Test
public void testExecution() throws Exception {
AdviceWithRouteBuilder.adviceWith(context, startUri, adviceWithRouteBuilder -> {
//a.mockEndpointsAndSkip(errorUri);
adviceWithRouteBuilder.mockEndpoints(errorUri);
adviceWithRouteBuilder.interceptSendToEndpoint(errorUri).skipSendToOriginalEndpoint().to(mockErrorURI);
});
MockEndpoint mockEndpoint = getMockEndpoint(mockErrorURI);
mockEndpoint.setExpectedMessageCount(1);
context.start();
sendBody(startUri, "A Test message");
assertMockEndpointsSatisfied();
Assert.assertNotNull(mockEndpoint.getExchanges().get(0).getProperty(Exchange.EXCEPTION_CAUGHT));
Exception receivedException = (Exception) mockEndpoint.getExchanges().get(0).getProperty(Exchange.EXCEPTION_CAUGHT);
Assert.assertTrue(receivedException instanceof Exception);
Assert.assertEquals(receivedException.getMessage(), ERROR_MESSAGE);
}
}