2011-12-20 2 views
16

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

Basic component pattern

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

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

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

  • тест, чтобы увидеть, если есть сообщения, ожидающие определенный на «вход "очередь
  • Потяните эти сообщения вниз и обработать их
  • Push-новые сообщения на„очереди вывода“и убедитесь, что они сделали это там

I быть Лиеве Мне нужно создать 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() проверял, что сообщение присутствует внутри конкретной очереди или что определенная очередь содержит сообщения?
+0

HTTP: // StackOverflow. com/questions/5664331/how-to-unit-test-production-routes-in-apache-camel –

ответ

11

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

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

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

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

Я предпочитаю AdviceWith, потому что он очень гибкий и использует привычные MockEndpoints. Для полного примера этого, см this 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"); 
+0

Я ценю ответ boday - и да, я буду тестировать компоненты отдельно (и их методы «процесса»). Однако, как часть своего «теста интеграции» между компонентами и их очередями ввода/вывода, я хочу автоматизировать проверку сообщений, перемещающих длинные определенные маршруты. API AdviceWith кажется интересным, и я проверю его. Но его существование, похоже, сводит на нет потребность в MockEndpoint. Можете ли вы уточнить, когда это целесообразно использовать каждый? И еще раз спасибо! – IAmYourFaja

+0

Адам, для истинного сквозного тестирования, используйте AdviceWith, чтобы динамически вводить MockEndpoints в существующие маршруты производства. Mock очень эффективен из-за предоставленных API статистики/утверждения, но НЕ должен быть добавлен непосредственно к производственным маршрутам. Я обновлю свой ответ примером для этого ... –

+0

@boday, можете ли вы, пожалуйста, заполнить пример, показывающий, как отправить «Exchange» на маршрут? Я прошу, потому что мне непонятно, как вы можете отправить «Exchange» на маршрут 'from'. Заранее спасибо. – danidemi

Смежные вопросы