У меня есть следующий тест:шаблон тест Camel использует другой обмен, чем тот, я посылаю
public class MyTest extends CamelSpringTestSupport {
@Override
protected AbstractXmlApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext(new String[] {
"classpath:my-config.xml",
});
}
@Test
public void testSomething() throws Exception {
Exchange exchange = new DefaultExchange(context);
exchange.getIn().setHeader("myId", "1234");
MessageContentsList parameters = new MessageContentsList();
parameters.add(0, "");
parameters.add(1, "1234");
exchange.getIn().setBody(parameters);
System.out.println("exchange before = " + System.identityHashCode(exchange)); //1657040467
template.send("direct:myRoute", exchange);
Object object = exchange.getOut().getBody();
System.out.println("result = " + object); //null
System.out.println("exchange after = " + System.identityHashCode(exchange)); //1657040467
assertFalse(exchange.isFailed());
}
}
Вот последний шаг в пути «прямой: MyRoute»:
public void doSomething(Exchange exchange)
{
System.out.println("exchange within = " + System.identityHashCode(exchange)); //1649140180
exchange.getOut().setBody(1);
}
Мои маршруты определяются RouteBuilder
классов и загружаю их
<camelContext id="mainContext" xmlns="http://camel.apache.org/schema/spring">
<packageScan>
<package>com.my.route</package>
</packageScan>
</camelContext>
, а также динамически по коду:
((CamelContext) applicationContext.getBean("mainContext")).addRoutes(routeBuilder);
Как вы можете видеть, я не могу получить выход на маршрут, когда я звоню маршрут из теста, так как в тесте по какой-то причине он является другим объектом обмена (однако, оригинальные заголовки обмена и свойства каким-то образом скопированы на биржу в пределах маршрута). Эта проблема не возникает, когда я определяю маршруты по XML.
Почему это и как я могу получить результат маршрута, когда я его вызываю из теста?
Вы имели в виду 'out = template.send (...)'? В противном случае вы не сможете скомпилировать. В любом случае 'out.getOut(). GetBody()' по-прежнему 'null'. Я думаю, что способ, которым я его использовал, все еще работает, потому что он фактически возвращает входной обмен. Но это детали реализации, поэтому, конечно, лучше сделать это так, как вы упомянули. Но это все еще не работает. Я не вижу никаких данных об обмене выводами. – rapt
Вы изменили шаблон обмена на InOut? –
Кстати, вы можете скомпилировать, но вы должны изменить на out = template.requestBody («direct: myRoute», «requestBody», Exchange.class); –