DataSet Test

Поддерживается только производитель

Тестирование распределённой и асинхронной обработки, как известно, -- задача не из лёгких. Конечные точки Mock (opens in a new tab) , DataSet (opens in a new tab) и DataSet Test (opens in a new tab) отлично работают с фреймворком Camel Testing Framework, упрощая модульное и интеграционное тестирование с помощью шаблонов интеграции Enterprise Integration Patterns (opens in a new tab) и широкого спектра компонентов Camel в сочетании с мощным механизмом Bean Integration.

Компонент dataset-test расширяет компонент Mock (opens in a new tab) для поддержки извлечения сообщений из другой конечной точки при запуске, чтобы задать ожидаемые тела сообщений в базовой конечной точке Mock (opens in a new tab) .

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

Таким образом, вы можете использовать, например, ожидаемый набор тел сообщений в качестве файлов. Это позволит создать правильно настроенную конечную точку Mock (opens in a new tab) , которая будет действительна только в том случае, если количество полученных сообщений соответствует ожидаемому, а их полезная нагрузка одинакова.

URI format

dataset-test:expectedMessagesEndpointUri

Где expectedMessagesEndpointUri ссылается на некоторый другой URI компонента, из которого извлекаются ожидаемые тела сообщений перед началом теста.

Configuring Options

Компоненты Camel настраиваются на двух отдельных уровнях:

  • уровень компонентов

  • уровень конечной точки

Configuring Component Options

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

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

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

Вы можете настроить компоненты, используя:

  • Компонент DSL (opens in a new tab) .

  • в файле конфигурации ( application.propertiesфайлы *.yaml, и т.д.).

  • непосредственно в коде Java.

Configuring Endpoint Options

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

Конечные точки чаще всего настраиваются непосредственно в URI конечной точки в виде параметров пути и запроса . Вы также можете использовать Endpoint DSL (opens in a new tab) и DataFormat DSL (opens in a new tab) в качестве типобезопасного способа настройки конечных точек и форматов данных в Java.

Хорошей практикой при настройке параметров является использование заполнителей свойств (opens in a new tab) .

Заполнители свойств обеспечивают несколько преимуществ:

  • Они помогают предотвратить использование жестко запрограммированных URL-адресов, номеров портов, конфиденциальной информации и других настроек.

  • Они позволяют вынести конфигурацию за пределы кода.

  • Они помогают коду стать более гибким и пригодным для повторного использования.

В следующих двух разделах перечислены все параметры, сначала для компонента, а затем для конечной точки.

Component Options

Компонент DataSet Test поддерживает 4 параметра, которые перечислены ниже.

lazyStartProducer (producer)

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: boolean

log (producer)

  • Включить ведение журнала при получении фиктивным объектом входящего сообщения. Это позволит записать в журнал только одно сообщение на уровне INFO. Для более подробного ведения журнала установите уровень DEBUG для класса org.apache.camel.component.mock.MockEndpoint.

  • По умолчанию: false

  • Тип: boolean

autowiredEnabled (advanced)

  • Включено ли автоматическое связывание. Это используется для параметров автоматического связывания (параметр должен быть помечен как autowired) путём поиска в реестре экземпляра соответствующего типа, который затем настраивается в компоненте. Это может использоваться для автоматической настройки источников данных JDBC, фабрик JMS-подключений, клиентов AWS и т. д.

  • По умолчанию: true

  • Тип: boolean

exchangeFormatter (advanced)

  • Autowired Для использования пользовательского ExchangeFormatter для форматирования Exchange в строку, подходящую для регистрации.

  • По умолчанию:

  • Тип: ExchangeFormatter

Endpoint Options

Конечная точка теста DataSet настраивается с использованием синтаксиса URI:

dataset-test:name

Со следующими параметрами пути и запроса :

Path Parameters (1 parameters)

  • Тип: name (producer)

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

  • String

Query Parameters (17 parameters)

anyOrder (producer)

  • Должны ли ожидаемые сообщения приходить в одном и том же порядке или порядок может быть любым.

  • По умолчанию: false

  • Тип: boolean

assertPeriod (producer)

  • Устанавливает период отсрочки, по истечении которого фиктивный объект повторно выполнит проверку, чтобы убедиться в том, что предварительное утверждение всё ещё действительно. Это используется, например, для проверки получения ровно определённого количества сообщений. Например, если ожидаемое количество установлено равным 5, то проверка выполняется при получении пяти или более сообщений. Чтобы гарантировать получение ровно 5 сообщений, необходимо немного подождать, чтобы убедиться, что больше сообщений не поступает. Именно для этого можно использовать этот метод. По умолчанию этот период отключён.

  • По умолчанию:

  • Тип: long

  • Тип: delimiter (producer)

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

  • String

expectedCount (producer)

  • Задаёт ожидаемое количество сообщений, которые должен получить этот фиктивный объект. Внимание: если вы хотите ожидать 0 сообщений, будьте особенно внимательны, так как 0 соответствует началу тестов, поэтому необходимо установить период проверки, чтобы тест выполнялся некоторое время и убедиться, что сообщения не получены; для этого используйте параметр assertPeriod. Если вы хотите убедиться, что на этот фиктивный объект приходит ровно n-ное сообщение, см. также описание параметра assertPeriod для получения дополнительной информации.

  • По умолчанию: -1

  • Тип: int

split (producer)

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

  • По умолчанию: false

  • Тип: boolean

timeout (producer)

  • Тайм-аут, используемый при опросе тел сообщений из URI.

  • По умолчанию: 2000

  • Тип: long

copyOnExchange (producer (advanced))

  • Устанавливает, следует ли создавать глубокую копию входящего обмена при его получении в этой фиктивной конечной точке

  • По умолчанию: true

  • Тип: boolean

failFast (producer (advanced))

  • Устанавливает, должен ли метод assertIsSatisfied() быстро завершаться сбоем при первом обнаруженном несостоявшемся ожидании, или же он может дождаться получения всех ожидаемых сообщений, прежде чем выполнять проверку ожиданий. По умолчанию имеет значение true. Установите значение false, чтобы использовать поведение, как в Camel 2.x.

  • По умолчанию: true

  • Тип: boolean

lazyStartProducer (producer (advanced))

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: boolean

log (producer (advanced))

  • Включить ведение журнала при получении фиктивным объектом входящего сообщения. Это позволит записать в журнал только одно сообщение на уровне INFO. Для более подробного ведения журнала установите уровень DEBUG для класса org.apache.camel.component.mock.MockEndpoint.

  • По умолчанию: false

  • Тип: boolean

reportGroup (producer (advanced))

  • Число, которое используется для включения ведения журнала пропускной способности на основе размера групп.

  • По умолчанию:

  • Тип: int

  • Тип: resultMinimumWaitTime (producer (advanced))

  • Устанавливает минимальное ожидаемое время, в течение которого assertIsSatisfied() будет ожидать защелку, пока она не будет удовлетворена.

  • long

resultWaitTime (producer (advanced))

  • Устанавливает максимальное время, в течение которого assertIsSatisfied() будет ожидать защелку, пока она не будет удовлетворена.

  • По умолчанию:

  • Тип: long

  • Тип: retainFirst (producer (advanced))

  • Указывает, что нужно сохранять только первое n-ное количество полученных сообщений Exchange. Это используется при тестировании с большими данными, чтобы уменьшить потребление памяти за счет отказа от сохранения копий каждого сообщения Exchange, которое получает эта фиктивная конечная точка. Важно: при использовании этого ограничения getReceivedCounter() все равно вернет фактическое количество полученных сообщений. Например, если мы получили 5000 сообщений и настроили сохранение только первых 10 сообщений Exchange, то getReceivedCounter() все равно вернет 5000, но в методах getExchanges() и getReceivedExchanges() будут только первые 10 сообщений Exchange. При использовании этого метода некоторые другие методы ожидания не поддерживаются, например, expectedBodiesReceived(Object…​) устанавливает ожидание по первому количеству полученных тел. Вы можете настроить оба параметра remainFirst и remainLast, чтобы ограничить как первое, так и последнее полученное значение.

  • -1

  • int

retainLast (producer (advanced))

  • Указывает, что нужно сохранять только последнее n-ное количество полученных сообщений Exchange. Это используется при тестировании с большими данными, чтобы уменьшить потребление памяти за счет отказа от сохранения копий каждого сообщения Exchange, которое получает эта фиктивная конечная точка. Важно: при использовании этого ограничения getReceivedCounter() все равно вернет фактическое количество полученных сообщений. Например, если мы получили 5000 сообщений и настроили сохранение только последних 20 сообщений Exchange, то getReceivedCounter() все равно вернет 5000, но в методах getExchanges() и getReceivedExchanges() будут только последние 20 сообщений Exchange. При использовании этого метода некоторые другие методы ожидания не поддерживаются, например, expectedBodiesReceived(Object…​) устанавливает ожидание по первому количеству полученных тел. Вы можете настроить оба параметра remainFirst и remainLast, чтобы ограничить как первое, так и последнее полученное значение.

  • По умолчанию: -1

  • Тип: int

sleepForEmptyTest (producer (advanced))

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

  • По умолчанию:

  • Тип: long

  • Тип: browseLimit (advanced)

  • Максимальное количество сообщений, сохраняемых в памяти для просмотра. Значение 0 означает неограниченное количество.

  • 100

  • int

Example

Например, вы можете написать следующий тестовый пример:

from("seda:someEndpoint").
  to("dataset-test:file://data/expectedOutput?noop=true");

Если затем ваш тест вызывает метод MockEndpoint.assertIsSatisfied(camelContext) (opens in a new tab) , ваш тестовый случай выполнит необходимые утверждения.

Чтобы узнать, как задать другие ожидания для конечной точки теста, ознакомьтесь с компонентом Mock (opens in a new tab) .

Spring Boot Auto-Configuration

При использовании dataset-test с Spring Boot обязательно используйте следующую зависимость Maven для поддержки автоматической настройки:

<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-dataset-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

Компонент поддерживает 11 опций, которые перечислены ниже.

camel.component.dataset-test.autowired-enabled

  • Включено ли автоматическое связывание. Это используется для параметров автоматического связывания (параметр должен быть помечен как autowired) путём поиска в реестре экземпляра соответствующего типа, который затем настраивается в компоненте. Это может использоваться для автоматической настройки источников данных JDBC, фабрик JMS-подключений, клиентов AWS и т. д.

  • По умолчанию: true

  • Тип: Boolean

camel.component.dataset-test.enabled

  • Включить ли автоматическую настройку компонента dataset-test. По умолчанию эта функция включена.

  • По умолчанию:

  • Тип: Boolean

  • Тип: camel.component.dataset-test.exchange-formatter

  • TИспользовать пользовательский форматировщик ExchangeFormatter для форматирования Exchange в строку, подходящую для логирования. Параметр имеет тип org.apache.camel.spi.ExchangeFormatter.

  • ExchangeFormatter

camel.component.dataset-test.lazy-start-producer

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: Boolean

camel.component.dataset-test.log

  • Включить ведение журнала при получении фиктивным объектом входящего сообщения. Это позволит записать в журнал только одно сообщение на уровне INFO. Для более подробного ведения журнала установите уровень DEBUG для класса org.apache.camel.component.mock.MockEndpoint.

  • По умолчанию: false

  • Тип: Boolean

camel.component.dataset.autowired-enabled

  • Включено ли автоматическое связывание. Это используется для параметров автоматического связывания (параметр должен быть помечен как autowired) путём поиска в реестре экземпляра соответствующего типа, который затем настраивается в компоненте. Это может использоваться для автоматической настройки источников данных JDBC, фабрик JMS-подключений, клиентов AWS и т. д.

  • По умолчанию: true

  • Тип: Boolean

camel.component.dataset.bridge-error-handler

  • Позволяет подключить потребителя к обработчику ошибок маршрутизации Camel. Это означает, что любые исключения (если это возможно), возникающие при попытке потребителя Camel получить входящие сообщения или что-то подобное, теперь будут обрабатываться как сообщение и обрабатываться обработчиком ошибок маршрутизации. Важно: это возможно только в том случае, если сторонний компонент позволяет Camel получать оповещения о возникновении исключения. Некоторые компоненты обрабатывают это только внутренне, поэтому использование bridgeErrorHandler невозможно. В других ситуациях мы можем улучшить компонент Camel для подключения к сторонним компонентам и сделать это возможным в будущих выпусках. По умолчанию потребитель будет использовать org.apache.camel.spi.ExceptionHandler для обработки исключений, которые будут зарегистрированы на уровне WARN или ERROR и проигнорированы.

  • По умолчанию: false

  • Тип: Boolean

camel.component.dataset.enabled

  • Включить ли автоматическую настройку компонента набора данных. По умолчанию эта функция включена.

  • По умолчанию:

  • Тип: Boolean

  • Тип: camel.component.dataset.exchange-formatter

  • Использовать пользовательский форматировщик ExchangeFormatter для форматирования Exchange в строку, подходящую для логирования. Параметр имеет тип org.apache.camel.spi.ExchangeFormatter.

  • ExchangeFormatter

camel.component.dataset.lazy-start-producer

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: Boolean

camel.component.dataset.log

  • Включить ведение журнала при получении фиктивным объектом входящего сообщения. Это позволит записать в журнал только одно сообщение на уровне INFO. Для более подробного ведения журнала установите уровень DEBUG для класса org.apache.camel.component.mock.MockEndpoint.

  • По умолчанию: false

  • Тип: Boolean