Я пишу интеграционные тесты для проверки существующих маршрутов. Рекомендуемый способ получения ответа выглядит примерно так (через Camel In Action раздел 6.4.1):
public class TestGetClaim extends CamelTestSupport {
@Produce(uri = "seda:getClaimListStart")
protected ProducerTemplate producer;
@Test
public void testNormalClient() {
NotifyBuilder notify = new NotifyBuilder(context).whenDone(1).create();
producer.sendBody(new ClientRequestBean("TESTCLIENT", "Y", "A"));
boolean matches = notify.matches(5, TimeUnit.SECONDS);
assertTrue(matches);
BrowsableEndpoint be = context.getEndpoint("seda:getClaimListResponse", BrowsableEndpoint.class);
List<Exchange> list = be.getExchanges();
assertEquals(1, list.size());
System.out.println("***RESPONSE is type "+list.get(0).getIn().getBody().getClass().getName());
}
}
Тест запускается, но я ничего не получаю обратно. Сбой assertTrue(matches)
после 5-секундного тайм-аута.
Если я перепишу тест, чтобы он выглядел так, я получу ответ:
@Test
public void testNormalClient() {
producer.sendBody(new ClientRequestBean("TESTCLIENT", "Y", "A"));
Object resp = context.createConsumerTemplate().receiveBody("seda:getClaimListResponse");
System.out.println("***RESPONSE is type "+resp.getClass().getName());
}
В документации немного об этом сказано, поэтому кто-нибудь может сказать мне, что я делаю не так с первым подходом? Есть ли что-то плохое в том, чтобы следовать второму подходу?
Спасибо.
UPDATE
Я разбил это, и похоже, что проблема в том, что seda используется в качестве начальной конечной точки в сочетании с использованием receientList в маршруте. Я также изменил конструкцию NotifyBuilder (у меня была указана неверная конечная точка).
- Если я изменю начальную конечную точку на
direct вместо seda , тогда тест будет работать; или
- Если я закомментирую receientList
тогда тест будет работать.
Вот урезанная версия моего маршрута, которая воспроизводит эту проблему:
public class TestRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
// from("direct:start") //works
from("seda:start") //doesn't work
.recipientList(simple("exec:GetClaimList.bat?useStderrOnEmptyStdout=true&args=${body.client}"))
.to("seda:finish");
}
}
Обратите внимание, что если я изменю исходный код NotifyTest из источника " Camel In Action " на построитель маршрутов, подобный этому, то он также завершится неудачей.