Верблюд: макет и возвращаемое значение из компонента в маршруте
У меня есть следующий маршрут в моем сервисе:
public void configure() {
/*
* Scheduled Camel route to produce a monthly report from the audit table.
* This is scheduled to run the first day of every month.
*/
// @formatter:off
from(reportUri)
.routeId("monthly-report-route")
.log("Audit report processing started...")
.to("mybatis:updateProcessControl?statementType=Update")
.choice()
/*
* If the rows updated is 1, this service instance wins and can run the report.
* If the rows updated is zero, go to sleep and wait for the next scheduled run.
*/
.when(header("CamelMyBatisResult").isEqualTo(1))
.process(reportDateProcessor)
.to("mybatis:selectReport?statementType=SelectList&consumer.routeEmptyResultSet=true")
.process(new ReportProcessor())
.to("smtp://smtpin.tilg.com?to="
+ emailToAddr
+ "&from=" + emailFromAddr )
.id("RecipientList_ReportEmail")
.endChoice()
.end();
// @formatter:on
}
Когда я пытаюсь запустить тест на это, это выдает мне сообщение о том, что верблюд не может автоматически создать компонент mybatis. У меня нет опыта в тестировании верблюжьих маршрутов, поэтому я не совсем уверен, куда идти с этим. Первый вызов mybatis обновляет строку в таблице, которая не тестируется, поэтому я хотел бы сделать что-то вроде того, когда конечная точка нажата, вернуть заголовок CamelMyBatisResult со значением 1. Вторая конечная точка mybatis должна вернуть hashmap(пуст для первого теста, заполняется для второго). Как мне реализовать механизм "когда / то" с верблюжьим тестированием? Я посмотрел на поддельные документы верблюдов конечной точки, но я не могу понять, как применить это и заставить его вернуть значение для обмена, а затем продолжить маршрут (конечный результат теста - проверить, что письмо с или без вложения отправляется)
РЕДАКТИРОВАТЬ: попытался использовать оба метода replace(). Set* и заменить конечные точки mybatis вызовом встроенных процессоров:
@Test
public void test_reportRoute_NoResultsFound_EmailSent() throws Exception {
List<AuditLog> bodyList = new ArrayList<>();
context.getRouteDefinition("monthly-report-route").adviceWith(context,
new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
replaceFromWith(TEST);
weaveById("updateProcControl").replace()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader("CamelMyBatisResult", 1);
}
});
weaveById("selectReport").replace()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody(bodyList);
}
});
weaveById("RecipientList_reportEmail").replace()
.to("smtp://localhost:8083"
+"?to=" + "test@test.com"
+"&from=" + "test1@test1.com");
}
});
ProducerTemplate prod = context.createProducerTemplate();
prod.send(TEST, exch);
assertThat(exch.getIn().getHeader("CamelMyBatisResult"), is(1));
assertThat(exch.getIn().getBody(), is(""));
}
Пока что заголовок все еще нулевой, как и тело (переменная TEST является прямым компонентом)
1 ответ
Если вы хотите добавить жестко запрограммированные ответы, вам легче будет посоветоваться с вашими маршрутами. Смотрите здесь: http://camel.apache.org/advicewith.html
Как правило, добавьте идентификатор для каждой конечной точки или .to()
, Затем в вашем тесте выполните рекомендацию с, а затем замените этот.to() каким-либо жестко закодированным ответом. Это может быть карта, строка или что-то еще, что вы хотите, и она будет заменена. Например:
context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// weave the node in the route which has id = bar
// and replace it with the following route path
weaveById("bar").replace().multicast().to("mock:a").to("mock:b");
}
});
Обратите внимание, в документации сказано, что вам нужно переопределить метод isAdviceWith, а также запускать и останавливать camelContext вручную.
Дайте нам знать, если у вас возникнут проблемы с ним. Это может быть немного сложно, чтобы начать, но как только вы освоите его, на самом деле очень мощно высмеивать ответы.
Вот пример, который добавляет тело к простому выражению, когда вы делаете совет с.
context.getRouteDefinition("yourRouteId").adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
weaveById("yourEndpointId").replace().setBody(new ConstantExpression("whateveryouwant"
));
}
});