Тестирование маршрута верблюда с имитацией конечной точки

Тестирование маршрута верблюда с помощью Springboot, Activemq и фиктивной конечной точки

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

Я пытаюсь протестировать, создавая и отправляя сообщение с помощью ProducerTemplate, создавая фиктивную конечную точку «mock: result» и используя в качестве последнего узла для маршрута и выполняя на нем assert. Это не удовлетворяет утверждения.

Верблюжий маршрут:

from("queue:myIncomingQueue?username=***&password=***")
    .doTry()
        .log(LoggingLevel.INFO, "Incoming Message: [ body:${body} ]")
        .to("bean-validator:validateIncomingMessage")
        .unmarshal(myUnmarshller.format())
        .setHeader(Constants.MESSAGE_VALID, constant(true))
    .endDoTry()
    .doCatch(Exception.class)
        .log(LoggingLevel.ERROR, 
            "failed to parse message [ body:${body} ], Exception - "
                + exceptionMessage())
    .end()
    .choice()
        .when(header(Constants.MESSAGE_VALID).isNotNull())
            .doTry()
                .process(myProcessor)
            .endDoTry()
            .doCatch(Exception.class)
                .log(LoggingLevel.ERROR, 
                    "failed to process message [ body:${body} ], Exception - "
                        + exceptionMessage())
            .end()
        .endChoice()
    .end();

Тестовый класс:

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = {Application.class}, properties = { 
    "camel.springboot.java-routes-include-pattern=**/MyRoute*"
})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
@MockEndpoints("mock:result")
public class MyRouteTest {

    @Autowired
    private CamelContext camelContext;

    @Produce(uri = "queue:myIncomingQueue?username=***&password=***")
    private ProducerTemplate template;

    @EndpointInject(uri = "mock:result")
    private MockEndpoint mockOutput;

    @Before
    public void setUp() throws Exception
    {
        camelContext.getRouteDefinitions().get(0).adviceWith(camelContext,
            new AdviceWithRouteBuilder()
            {
                @Override
                public void configure() throws Exception {
                    weaveAddLast().to("mock:result");
                }
            });
        camelContext.start();
    }

    @Test
    public void messagesuccessful() throws Exception {
        Exchange dummyExchange = this.generateDataExchange();
        mockOutput.expectedMessageCount(1);
        mockOutput.expectedBodiesReceived(dummyExchange.getIn().getBody());
        mockOutput.message(0).header("API-X-HEADER").isEqualTo(123);

        template.send(dummyExchange);
        Thread.sleep(6000);
        mockOutput.assertIsSatisfied();
    }
}

Результат:

> java.lang.AssertionError: mock://result Received message count. Expected: <1> 
but was: <0>
Expected :<1> 
Actual   :<0>
<Click to see difference>

Вы пробовали добавить аннотацию @UseAdviceWith в свой тестовый класс? Также вместо Thread.sleep(...) вы должны посмотреть NotifyBuilder. Вы также можете упростить тестовый класс, запустив его с SpringRunner и заменив Application.class на свой маршрут для тестирования. Если вы не определяете @EnableAutoConfiguration, вам следует добавить тестовую конфигурацию и CamelAutoConfiguration к классам @SpringBootTest. Можно увидеть простой скелет здесь.

Roman Vottner 21.08.2018 14:20

Что касается ошибки теста, пытались ли вы включить журнал отладки Camel и / или возможности отслеживания и посмотреть, где что-то пойдет не так? Для простоты вы также можете заменить конечную точку отправления на direct:start, добавив replaceFromWith("direct:start") в ваш маршрут.

Roman Vottner 21.08.2018 14:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
1 288
0

Другие вопросы по теме