Модульное тестирование FTP-клиента с Apache Camel - PullRequest
4 голосов
/ 03 марта 2012

У меня есть маршрут ниже. В модульном тестировании, поскольку у меня нет доступного FTP-сервера, я хотел бы использовать поддержку тестирования верблюда и отправить недопустимое сообщение на "ftp://hostname/input" и убедиться, что оно не удалось и перенаправлено на "ftp://hostname/error".

Я просмотрел документацию, в которой в основном говорится об использовании конечной точки «mock:», но я не уверен, как использовать ее в этом сценарии.

public class MyRoute extends RouteBuilder
{
    @Override
    public void configure()
    {
        onException(EdiOrderParsingException.class).handled(true).to("ftp://hostname/error");

        from("ftp://hostname/input")
            .bean(new OrderEdiTocXml())
            .convertBodyTo(String.class)
            .convertBodyTo(Document.class)
            .choice()
            .when(xpath("/cXML/Response/Status/@text='OK'"))
            .to("ftp://hostname/valid").otherwise()
            .to("ftp://hostname/invalid");
    }
}

Ответы [ 4 ]

9 голосов
/ 04 марта 2012

Как говорит Бен, вы можете настроить FTP-сервер и использовать реальные компоненты.FTP-сервер может быть встроен, или вы можете настроить FTP-сервер на месте.Последнее больше похоже на интеграционное тестирование, где у вас может быть специальная среда тестирования.

Camel очень гибок в своем наборе тестов, и если вы хотите создать модульное тестирование, в котором не используется настоящий компонент FTP, то вы можете заменить это до испытания.Например, в вашем примере вы можете заменить входную конечную точку маршрута прямой конечной точкой, чтобы упростить отправку сообщения на маршрут.Затем вы можете использовать перехватчик для перехвата отправки на конечные точки ftp и обхода сообщения.

Рекомендация с частью набора для тестирования предлагает следующие возможности: http://camel.apache.org/advicewith.html. И также обсуждается в главе6 книги «Верблюд в действии», например, раздел 6.3, в котором говорится об имитации ошибок.

В вашем примере вы можете сделать что-то вроде

public void testSendError() throws Exception {
    // first advice the route to replace the input, and catch sending to FTP servers
    context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            replaceFromWith("direct:input");

            // intercept valid messages
            interceptSendToEndpoint("ftp://hostname/valid")
                .skipSendToOriginalEndpoint()
                .to("mock:valid");

            // intercept invalid messages
            interceptSendToEndpoint("ftp://hostname/invalid")
                .skipSendToOriginalEndpoint()
                .to("mock:invalid");
        }
    });

     // we must manually start when we are done with all the advice with
    context.start();

    // setup expectations on the mocks
    getMockEndpoint("mock:invalid").expectedMessageCount(1);
    getMockEndpoint("mock:valid").expectedMessageCount(0);

    // send the invalid message to the route
    template.sendBody("direct:input", "Some invalid content here");

    // assert that the test was okay
    assertMockEndpointsSatisfied();
}

Начиная с верблюда 2.10, мы сделаемперехватывать и издеваться немного проще, если использовать совет с.Также мы представляем заглушку.http://camel.apache.org/stub

4 голосов
/ 07 февраля 2013

Посмотрите на MockFtPServer !

<dependency>
    <groupId>org.mockftpserver</groupId>
    <artifactId>MockFtpServer</artifactId>
    <version>2.2</version>
    <scope>test</scope>
</dependency>

С этим вы можете моделировать все виды поведения, такие как проблемы с разрешениями и т.д .:

Пример:

fakeFtpServer = new FakeFtpServer();

fakeFtpServer.setServerControlPort(FTPPORT);

FileSystem fileSystem = new UnixFakeFileSystem();
fileSystem.add(new DirectoryEntry(FTPDIRECTORY));
fakeFtpServer.setFileSystem(fileSystem);
fakeFtpServer.addUserAccount(new UserAccount(USERNAME, PASSWORD, FTPDIRECTORY));

...

assertTrue("Expected file to be transferred", fakeFtpServer.getFileSystem().exists(FTPDIRECTORY + "/" + FILENAME)); 
1 голос
/ 03 марта 2012

взгляните на этот модульный тест и те, которые находятся в одном каталоге ... они покажут вам, как подготовить локальный FTP-сервер для тестирования и как использовать CamelTestSupport для проверки сценариев на его основе и т. Д. *

пример модульного теста ...

https://svn.apache.org/repos/asf/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFileToFtpTest.java

, который расширяет этот класс поддержки тестирования ...

https://svn.apache.org/repos/asf/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpsServerTestSupport.java

0 голосов
/ 29 сентября 2016

В нашем проекте мы не создаем фиктивный FTP-сервер для тестирования маршрута, но мы используем свойства, которые можно заменить на file Camel Component для локальной разработки и модульного тестирования.

Ваш код будет выглядетькак это:

public class MyRoute extends RouteBuilder
{
    @Override
    public void configure()
    {
        onException(EdiOrderParsingException.class)
          .handled(true)
          .to("{{myroute.error}}");

        from("{{myroute.input.endpoint}}")
            .bean(new OrderEdiTocXml())
            .convertBodyTo(String.class)
            .convertBodyTo(Document.class)
            .choice()
              .when(xpath("/cXML/Response/Status/@text='OK'"))
                .to("{{myroute.valid.endpoint}}}")
              .otherwise()
                .to("{{myroute.invalid.endpoint}}");
    }
}

И локально, и для тестирования системы мы используем конечную точку файла, объявленную в файле свойств:

myroute.input.endpoint=file:/home/user/myproject/input
myroute.valid.endpoint=file:/home/user/myproject/valid
myroute.invalid.endpoint=file:/home/user/myproject/invalid
myroute.error=file:/home/user/myproject/error

или в JUnit CamelTestSupport вы можете использовать useOverridePropertiesWithPropertiesComponentметод, чтобы установить свойства, которые вы хотите переопределить.

В качестве альтернативы вы можете использовать вместо этого «прямой» маршрут, но вы можете пропустить некоторые параметры файла, которые могут быть проверены модульным тестом.

И мы проверяем только соединение FTP сРеальная система, установив свойства, подобные этим:

myroute.input.endpoint=ftp://hostname/input
myroute.valid.endpoint=ftp://hostname/valid
myroute.invalid.endpoint=ftp://hostname/invalid
myroute.error=ftp://hostname/error

При этом вы также можете иметь другую конфигурацию, например, для производственного сервера, которая будет отличаться от среды тестирования интеграции.

Пример свойств для производстваокружение:

myroute.input.endpoint=ftp://hostname-prod/input
myroute.valid.endpoint=ftp://hostname-prod/valid
myroute.invalid.endpoint=ftp://hostname-prod/invalid
myroute.error=ftp://hostname-prod/error

По моему мнению, вполне допустимо использовать конечную точку файла для упрощения кода JUnit, и он будет проверять только маршрут, а не соединение.

Проверка соединения болеекак Интеграционный тест, и должен выполняться на реальном сервере, связанном с реальной внешней системой (в вашем случае FTP-серверы, но могут быть и другие конечные точки / системы).

Используя свойства, вы также можете настроить различные URL-адреса для каждой среды (например: у нас есть 3 среды тестирования и одна производственная среда, все с разными конечными точками).

...