Тестирование верблюда с помощью MockEndpoints - программирование
Подтвердить что ты не робот

Тестирование верблюда с помощью MockEndpoints

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

Basic component pattern

Если каждый компонент расходует сообщения из входной очереди, обрабатывает сообщения (сообщения), а затем помещает 1+ сообщений в очередь исходящих/исходящих сообщений. Затем очередь "output" становится "входной" очередью для следующего компонента в цепочке. Довольно простой.

Теперь я пытаюсь свернуть рукава и провести модульное тестирование для каждого компонента, используя MockEndpoints, предоставленный API тестирования Camel. Я проливал javadocs и несколько примеров на веб-сайте Camel, но мне трудно связаться со всеми точками.

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

  • Проверить, есть ли сообщения, ожидающие в определенной "входной" очереди
  • Вытащите эти сообщения и обработайте их.
  • Нажимайте новые сообщения в очередь вывода и убедитесь, что они сделали это там

Мне кажется, мне нужно создать MockEndpoints для каждой очереди следующим образом:

@EndpointInject(uri = "mock:inputQueue")
protected MockEndpoint intputQueue;

@EndpointInject(uri = "mock:outputQueue")
protected MockEndpoint outputQueue;

Итак, теперь в моих методах тестирования JUnit я могу настроить ожидания и взаимодействовать с этими конечными точками:

@Test
public final void processMethodShouldSendToOutputQueue()
{
    Component comp = new Component();
    comp.process();

    outputQueue.assertIsSatisfied();
}

Я просто не понимаю, как правильно подключить все:

  • Как подключить comp к inputQueue и outputQueue MockEndpoints?
  • Для каждого MockEndpoint, как мне настроить ожидания, чтобы assertIsSatisfied() проверял, что сообщение присутствует внутри определенной очереди или что определенная очередь содержит сообщения?
4b9b3361

Ответ 1

Адам, есть несколько способов сделать это.

Для компонентов POJO, blackbox проверяет их отдельно от любого контекста/маршрутизации Camel, чтобы сосредоточиться на бизнес-логике.

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

  • используйте NotifyBuilder, чтобы создать выражения для проверки Exchange (несколько сложный, чтобы привлечь вашу голову).
  • используйте AdviceWith для динамического изменения маршрута перед его запуском (добавьте конечные точки Log/Mock и т.д.)

Я предпочитаю AdviceWith, потому что он очень гибкий и использует привычные MockEndpoints. Полный пример этого можно найти в this unit test

Короче говоря, вы создадите unit test, чтобы ввести MockEndpoints в свой маршрут, а затем проверить их как обычно...

context.getRouteDefinition("myRouteId").adviceWith(context, new AdviceWithRouteBuilder() {
    @Override
    public void configure() throws Exception {
        // mock all endpoints
        mockEndpoints();
    }
});

getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World");

template.sendBody("direct:start", "Hello World");