Написание модульных тестов для верблюжьих маршрутов в приложении SpringBoot - получение messageCount 0 - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь написать модульные тесты для верблюжьего маршрута - для импорта и обработки файла

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 Ответ

0 голосов
/ 01 ноября 2018

Прежде всего: вы используете 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();
}
...