Написание юнит-тестов для верблюжьих маршрутов в приложении 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();
}
Другие вопросы по тегам