FTP-маршрут — модульное тестирование

У меня есть верблюжий маршрут, который:

  1. опрашивает FTP-сервер на наличие новых XML-файлов
  2. загружает файлы локально
  3. проверяет файлы XML на соответствие XSD
  4. разбивает XML по категориям на объекты
  5. преобразует сущности в json
  6. отправляет json в конечную точку HTTP

ОБНОВЛЕНИЕ: теперь это работает

@Component
public class FTPPoller extends RouteBuilder {
    XmlJsonDataFormat xmlJsonFormat = new XmlJsonDataFormat();

    @Override
    public void configure() throws Exception {

        from("{{endpoint.ftp.server}}")
                .id("ftp-poller")
                .log("Found file ${file:name}.")
                .to("{{endpoint.local.validation}}");


        from("{{endpoint.local.validation}}")
                .id("xml-validator")
                .log("Processing file ${file:name}.")
                .doTry()
                    .to("validator:classpath:schema/fr-masterdata.xsd")
                    .log("File ${file:name} is valid.")
                    .to("{{endpoint.local.processing}}")
                .doCatch(org.apache.camel.ValidationException.class)
                    .log("File ${file:name} is invalid.")
                    .to("{{endpoint.local.error}}")
                .end();

        from("{{endpoint.local.processing}}")
                .id("xml-processor")
                .split(xpath("//flu:entities/category")
                        .namespace("flu", "hxxx://www.xxx.com")
                ).streaming()
                .marshal(xmlJsonFormat)
                .to("direct:category")
                .end();

        from("direct:category")
                .id("requestbin")
                .log("Processing category ${body}")
                .setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
                .to("{{endpoint.requestbin}}");

    }
}

Tests :

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = {HbIntegrationApplication.class},
        properties = { "camel.springboot.java-routes-include-pattern=**/FTPPoller*"})
public class FTPPollerTest {

    @Autowired
    protected ProducerTemplate producerTemplate;

    @EndpointInject(uri = "{{endpoint.requestbin}}")
    protected MockEndpoint requestbinEndpoint;

    @EndpointInject(uri = "{{endpoint.local.error}}")
    protected MockEndpoint localErrorEndpoint;

    @Before
    public void cleanDir() throws Exception {
        deleteDirectory("hb");
    }


    @Test
    @DirtiesContext
    public void testFileUploadSuccess() throws Exception {
        String fileContent = FileUtils.readFileToString(new File("src/test/resources/test-files/category.xml"));

        requestbinEndpoint.expectedMessageCount(2);
        producerTemplate.sendBody("file://hb/incoming", fileContent);

        requestbinEndpoint.assertIsSatisfied();
    }

    @Test
    @DirtiesContext
    public void testFileUploadFailure() throws Exception {

        localErrorEndpoint.expectedMessageCount(1);
        requestbinEndpoint.expectedMessageCount(0);

        producerTemplate.sendBody("file://hb/incoming", "invalidContent");

        localErrorEndpoint.assertIsSatisfied();
        requestbinEndpoint.assertIsSatisfied();
    }
}

application.properties :

endpoint.ftp.server=file://hb/incoming
endpoint.local.validation=file://hb/validation
endpoint.local.processing=file://hb/processing
endpoint.local.error=mock:file://hb/error
endpoint.requestbin=mock:requestbin

Остался вопрос:

Если я определил следующее свойство:

endpoint.local.processing=mock:file://hb/processing

мой тест не работает с:

Caused by: java.lang.UnsupportedOperationException: You cannot consume from this endpoint

Есть ли способ определить, какие маршруты следует включить в мой модульный тест?


person eistropfen    schedule 15.09.2017    source источник
comment
Почему вы спрашиваете о двух контекстах? Вы ожидаете получить 2 и получить 0? Ответ Клауса ниже правильный в том, что вам нужно указать ожидаемое перед отправкой. Окончательно. Вы ограничиваете файлы по имени файла на маршруте from? Если нет, то, я думаю, это будет случай найти, где он терпит неудачу в цепочке, а затем проанализировать это.   -  person user3206236    schedule 17.09.2017


Ответы (1)


Вам нужно установить ожидания для макетов перед отправкой данных в Camel, например, этот код

    localValidationEndpoint.sendBody(xml);

    requestbinEndpoint.expectedMessageCount(2);
    requestbinEndpoint.assertIsSatisfied();

Должно быть

    requestbinEndpoint.expectedMessageCount(2);

    localValidationEndpoint.sendBody(xml);

    requestbinEndpoint.assertIsSatisfied();
person Claus Ibsen    schedule 15.09.2017
comment
Спасибо, Клаус. Я уже пробовал это с тем же результатом. Я думаю, проблема в том, что загружаются 2 контекста (DefaultCamelContext и SpringCamelContext). Какие Annoations/config следует использовать для приложения Spring Boot/Apache Camel, которое использует Annotations? - person eistropfen; 15.09.2017
comment
В книге Camel in Action 2nd edition есть глава о тестировании с помощью Camel и Spring Boot, а в исходном коде также есть примеры. В противном случае вы можете проверить исходный код camel-spring-boot и его модульные тесты, как он это делает. - person Claus Ibsen; 16.09.2017
comment
Спасибо, Клаус. Я изменил код в соответствии с вашим образцом, но тестовый пример по-прежнему не работает, тогда как само приложение работает нормально. Я добавил подробные журналы выше. Я только недавно начал использовать Camel для POC (по сравнению с интеграцией Spring), и до сих пор я склоняюсь к Camel, однако модульное тестирование кажется не таким простым? Могу ли я написать модульный тест для нескольких маршрутов? например отправить файл на конечную точку {{endpoint.ftp.server}} и убедиться, что на конечную точку {{endpoint.requestbin}} было получено 2 сообщения? - person eistropfen; 18.09.2017
comment
Я предлагаю взять копию моей книги Camel in Action 2nd edition и прочитать главу о тестировании. Если нет, то попробуйте перечитать документацию по тестированию на сайте (пусть и не такую ​​подробную и хорошо структурированную, как в книге). Также посмотрите на модульные тесты самого исходного кода верблюда, чтобы вдохновиться тестированием. - person Claus Ibsen; 18.09.2017
comment
И да, вы, безусловно, можете протестировать несколько маршрутов. Для более продвинутого тестирования прочитайте о советах по тестированию. - person Claus Ibsen; 18.09.2017
comment
спасибо Клаус. Я действительно купил копию вчера. жду финальную версию. - person eistropfen; 19.09.2017