Тестирование верблюда с помощью MockEndpoints - PullRequest
17 голосов
/ 20 декабря 2011

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

Basic component pattern

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

Я сейчас пытаюсь засучить рукава и провести модульное тестирование для каждого компонента, используя 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() проверял наличие сообщения в определенной очереди или что конкретная очередь содержит сообщения?

1 Ответ

12 голосов
/ 20 декабря 2011

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

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

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

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

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

Короче говоря, вы создадите модульный тест для внедрения 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");
...