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