Написание юнит-тестов для верблюжьих маршрутов в приложении SpringBoot - получение messageCount 0
Я пытаюсь написать модульные тесты для верблюжьего маршрута - его для импорта и обработки файла
from(fullImportFTP)
.routeId(STUB_FILE_DOWNLOAD_ROUTE_ID)
.onException(Exception.class)
.handled(false)
.log(LoggingLevel.ERROR, STUB_IMPORT_ERROR_CODE)
.end()
.log("Processing Stub file:[${header.CamelFileName}]")
.to(ROUTE_TO_MACE);
from(ROUTE_TO_MACE)
.routeId(STUB_FILE_IMPORT_ROUTE_ID)
.onException(Exception.class)
.handled(false)
.log(LoggingLevel.ERROR, STUB_IMPORT_ERROR_CODE)
.end()
.onException(IOException.class)
.maximumRedeliveries(routesConfig.camelMaximumRetries).redeliveryDelay(routesConfig.camelRedeliveryDelay)
.handled(false)
.log(LoggingLevel.ERROR, STUB_IMPORT_ERROR_CODE)
.end()
.split().tokenizeXML(ITEM).streaming()
.process(processor)
.to("log:route.StubRoute?level=DEBUG")
.end()
.log("Stub file sucessfully processed:[${header.CamelFileName}]");
А ниже приведен модульный тест:
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class CamelRouteTest {
@EndpointInject(uri = "mock:success_result")
private MockEndpoint successResultEndpoint;
@EndpointInject(uri = "direct:mock-import-stub-download")
private FluentProducerTemplate producer;
@Autowired
private CamelContext camelContext;
@MockBean
RestTemplate restTemplate;
private static final String MOCK_IMPORT_STUB_DOWNLOAD = "direct:mock-import-stub-download";
private static final String TEST_STUB_FILE_LOCATION = "src/test/resources";
@Before
public void setup() throws Exception {
camelContext.getRouteDefinition(STUB_FILE_DOWNLOAD_ROUTE_ID).autoStartup(true).adviceWith(camelContext,
new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
replaceFromWith(MOCK_IMPORT_STUB_DOWNLOAD);
interceptSendToEndpoint("log:route.StubRoute?level=DEBUG").skipSendToOriginalEndpoint().to(successResultEndpoint);
}
});
camelContext.start();
}
@Test
public void testFileDownloadRouter() throws Exception {
File file = new File(TEST_STUB_FILE_LOCATION + "/Stub_11092018_162149_59642501.xml");
successResultEndpoint.expectedMessageCount(1);
producer.withBody(file).withHeader(Exchange.FILE_NAME, "Stub_24102018_162149_59642501.xml").send();
successResultEndpoint.assertIsSatisfied();
}
Я всегда получаю количество сообщений как 0. Вот ОШИБКА
java.lang.AssertionError: mock://success_result Количество полученных сообщений. Ожидаемый: <1>, но был: <0> Ожидаемый:<1> Фактический:<0>
Что я здесь не так делаю? У меня есть 2 маршрута, как вы можете видеть - первый действительно идет ко второму, так что в модульных тестах я должен иметь 2 маршрута тоже? Я не добавил 2 маршрута, потому что, если я отлаживаю, я вижу, что он действительно проходит через процессор и возвращает правильный результат.
1 ответ
Прежде всего: вы используете AdviceWith, поэтому вы должны поместить аннотацию @UseAdviceWith
на вашем тестовом классе. В противном случае автоматический запуск контекста Camel и рекомендации по маршруту могут перекрываться.
Для пропавшего сообщения на макете: Возможно, ваш тест просто утверждает, что слишком рано. Я предполагаю, что производитель не блокирует, пока сообщение обрабатывается, но утверждение MockEndpoint следует сразу после отправки сообщения. Сразу после отправки сообщения количество полученных сообщений по-прежнему равно 0.
Чтобы проверить, помогает ли ожидание, вы можете вставить Thread.sleep(). Если это работает, вы должны избавиться от Thread.sleep () и заменить его на Camel NotifyBuilder
Просто увидел другой момент. Финал to()
в вашем interceptSendToEndpoint
цепочка указывает на переменную экземпляра MockEndpoint. Я думаю, что это должно указывать на URI MockEndpoint, т.е. .to("mock:success_result")
И даже еще один: вы получаете первый путь к совету с getRouteDefinition(STUB_FILE_DOWNLOAD_ROUTE_ID)
но в этом совете вы советуете оба маршрута. Это, вероятно, причина вашей проблемы. Второй маршрут не рекомендуется, и поэтому ваш макет не на месте. Вы должны посоветовать второй маршрут в своем блоке советов.
@Before
public void setup() throws Exception {
camelContext.getRouteDefinition(STUB_FILE_DOWNLOAD_ROUTE_ID).autoStartup(true).adviceWith(camelContext, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
replaceFromWith(MOCK_IMPORT_STUB_DOWNLOAD);
}
});
camelContext.getRouteDefinition(STUB_FILE_IMPORT_ROUTE_ID).autoStartup(true).adviceWith(camelContext, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
interceptSendToEndpoint("log:route.StubRoute?level=DEBUG").skipSendToOriginalEndpoint().to("mock:success_result");
}
});
camelContext.start();
}