Перейти к основному содержимому

Тестирование Apache Camel Routes в Spring Boot

· 5 мин. чтения

1. Обзор

Apache Camel — это мощная среда интеграции с открытым исходным кодом, реализующая ряд известных шаблонов интеграции предприятия .

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

Во-первых, мы начнем с создания базового приложения Camel с использованием Spring Boot . Затем мы рассмотрим, как мы можем использовать API поддержки тестирования Camel Spring с JUnit 5 для тестирования нашего приложения.

2. Зависимости

Предположим, что наш проект настроен и настроен для работы с Spring Boot и Camel.

Затем нам нужно добавить зависимость camel-test-spring-junit5 к нашему pom.xml :

<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-spring-junit5</artifactId>
<version>3.15.0</version>
<scope>test</scope>
</dependency

Как следует из названия, эта зависимость предназначена специально для наших модульных тестов.

3. Определение простого приложения Camel Spring Boot

На протяжении всего этого руководства в центре внимания наших тестов будет простое приложение Apache Camel Spring Boot.

Итак, давайте начнем с определения точки входа нашего приложения:

@SpringBootApplication
public class GreetingsFileSpringApplication {

public static void main(String[] args) {
SpringApplication.run(GreetingsFileSpringApplication.class, args);
}
}

Как мы видим, это стандартное приложение Spring Boot.

3.1. Создание маршрута

Далее мы определим довольно элементарный маршрут:

@Component
public class GreetingsFileRouter extends RouteBuilder {

@Override
public void configure() throws Exception {

from("direct:start")
.routeId("greetings-route")
.setBody(constant("Hello ForEach Readers!"))
.to("file:output");
}
}

Вкратце напомним, что маршрут в Apache Camel — это фундаментальный строительный блок, обычно состоящий из последовательности шагов, выполняемых Camel по порядку, который получает и обрабатывает сообщение.

Как мы видим в нашем тривиальном примере, мы настраиваем наш маршрут для получения сообщений из прямой конечной точки, называемой start .

Затем мы задаем в теле сообщения строку Hello ForEach Readers! и записываем содержимое нашего обмена сообщениями, используя файловый компонент , в файловую директорию с именем output .

Мы также даем нашему маршруту идентификатор, который называется Greetings-Route . Использование идентификаторов в наших маршрутах обычно считается хорошей практикой и может помочь нам, когда мы приступим к тестированию наших маршрутов.

3.2. Запуск нашего приложения

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

$ cat output/D97099B6B2958D2-0000000000000000 
Hello ForEach Readers!

4. Несколько слов о тестировании

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

Мы также не хотим писать код в наших маршрутах специально для наших модульных тестов. К счастью, у Camel есть набор расширений и API специально для тестирования . Так что мы можем думать об этом как о своего рода наборе для тестирования.

Комплект упрощает тестирование наших приложений Camel, отправляя сообщения на маршруты и проверяя, что сообщения получены должным образом.

5. Тестирование с использованием @MockEndpoints

Имея в виду последний раздел, давайте продолжим и напишем наш первый модульный тест:

@SpringBootTest
@CamelSpringBootTest
@MockEndpoints("file:output")
class GreetingsFileRouterUnitTest {

@Autowired
private ProducerTemplate template;

@EndpointInject("mock:file:output")
private MockEndpoint mock;

@Test
void whenSendBody_thenGreetingReceivedSuccessfully() throws InterruptedException {
mock.expectedBodiesReceived("Hello ForEach Readers!");
template.sendBody("direct:start", null);
mock.assertIsSatisfied();
}
}

Давайте пройдемся по ключевым частям нашего теста.

Во-первых, мы начнем с украшения нашего тестового класса тремя аннотациями:

  • Аннотация @SpringBootTest гарантирует , что наш тест загружает контекст приложения Spring.
  • Мы также используем @CamelSpringBootRunner, который обеспечивает поддержку тестов Camel на основе Spring для наших тестов на основе загрузки .
  • Наконец, мы добавляем аннотацию @MockEndpoints , которая сообщает Camel, для каких конечных точек мы хотим создать макеты .

Затем мы автоматически связываем объект ProducerTemplate , который является интерфейсом, позволяющим нам отправлять обмен сообщениями на конечные точки.

Другой ключевой компонент — это MockEndpoint , который мы внедряем с помощью @EndpointInject . Используя эту аннотацию, Camel сообщает, когда начинается маршрут, что мы хотим внедрить нашу фиктивную конечную точку.

Теперь, когда у нас есть все наши тестовые настройки, мы можем написать наш тест, который состоит из трех шагов:

  • Во-первых, давайте установим ожидание, что наша фиктивная конечная точка получит данное тело сообщения.
  • Затем мы отправим сообщение на нашу конечную точку direct:start , используя наш шаблон. Обратите внимание, что мы отправим нулевое тело, поскольку наш маршрут не манипулирует телом входящего сообщения.
  • Чтобы завершить наш тест, мы используем метод assertIsSatisfied для проверки того, что наше первоначальное ожидание от нашей фиктивной конечной точки было удовлетворено.

Это подтверждает, что наш тест работает правильно. Потрясающий! Теперь у нас есть способ писать автономные, независимые модульные тесты, используя утилиты поддержки тестов Camel.

6. Заключение

В этой статье мы узнали, как тестировать наши маршруты Apache Camel в Spring Boot. Во-первых, мы узнали, как создать простое приложение Camel с одним маршрутом, используя Spring Boot.

Затем узнали о рекомендуемом подходе к тестированию наших маршрутов с использованием некоторых функций, доступных нам во встроенном проекте поддержки тестирования Apache Camel.

Как всегда, полный исходный код статьи доступен на GitHub .