Верблюд: как смоделировать маршрут с двумя конечными точками - PullRequest
0 голосов
/ 09 октября 2019

Я новичок в Camel, и мне нужно понять, как провести модульное тестирование моего маршрута с двумя конечными точками. Первые конечные точки получают идентификатор пользователя и используют его для второй конечной точки.

public RouteBuilder routeBuilder() {
    return new RouteBuilder() {
        @Override
        public void configure() throws HttpOperationFailedException {
            this.from(MyServiceConstant.ROUTE)
                    .setHeader(...)
                    .setHeader(...)
                    .to(MyConstants.THE_FIRST_ROUTE)
                    .setHeader(...)
                    .setHeader(...)
                    .process(...)
                    .setProperty(...)
                    .to(MyConstants.THE_SECOND_ROUTE)
        }
    };
}

Так что я должен издеваться над MyConstants.THE_FIRST_ROUTE и MyConstants.THE_SECOND_ROUTE в моем тестовом классе. Я сделал это, но не уверен, как написать тест. Все, что я делаю, это удар по второй конечной точке, но не знаю, как вызвать первую.

@Produce(uri = MyServiceConstant.ROUTE)
private MyService myService;

@EndpointInject(uri = "mock:" + MyConstants.THE_FIRST_ROUTE)
private MockEndpoint mockFirstService;

@EndpointInject(uri = ""mock:" + MyConstants.THE_SECOND_ROUTE)
private MockEndpoint mockSecondService;

@Test
@DirtiesContext
public void getDetails()throws Exception {

    // **The missing part**: Is this the right way to call my first service? 
    this.mockFirstService.setUserId("123456");

    // this returns a JSON that I'll compare the service response to
    this.mockSecondService.returnReplyBody(...PATH to JSON file);

    UserDetail userDetailsInfo = this.myService.getUserDetails(...args)

    // all of my assertions
    assertEquals("First name", userDetailsInfo.getFirstName());

    MockEndpoint.assertIsSatisfied();
}

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Сегодня у меня есть время, чтобы быстро взломать демо-код с помощью загрузочного архетипа Camel Spring. Вот так. Мой маршрут генерирует сообщения от компонента timer. Явная доставка в конечную точку не используется.

//Route Definition - myBean::saySomething() always returns String "Hello World"
@Component
public class MySpringBootRouter extends RouteBuilder {

    @Override
    public void configure() {
        from("timer:hello?period={{timer.period}}").routeId("hello_route")
            .transform().method("myBean", "saySomething")
            .to("log:foo")
                .setHeader("test_header",constant("test"))
            .to("log:bar");
    }

}

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
public class MySpringBootRouterTest {

    @Autowired
    SpringCamelContext defaultContext;

    @EndpointInject("mock:foo")
    private MockEndpoint mockFoo;
    @EndpointInject("mock:bar")
    private MockEndpoint mockBar;

    @Test
    @DirtiesContext
    public void getDetails() throws Exception {
        assertNotNull(defaultContext);
        mockBar.expectedHeaderReceived("test_header", "test");
        mockBar.expectedMinimumMessageCount(5);
        MockEndpoint.setAssertPeriod(defaultContext, 5_000L);
        MockEndpoint.assertIsSatisfied(mockFoo, mockBar);
        mockFoo.getExchanges().stream().forEach( exchange -> assertEquals(exchange.getIn().getBody(),"Hello World"));

        //This works too
        //mockBar.assertIsSatisfied();
        //mockFoo.assertIsSatisfied();
    }

    @Before
    public void attachTestProbes() throws Exception {
        //This is Camel 3.0 API with RouteReifier
        RouteReifier.adviceWith(defaultContext.getRouteDefinition("hello_route"), defaultContext, new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
           //Hook into the current route, intercept log endpoints and reroute them to mock
                interceptSendToEndpoint("log:foo").to("mock:foo");
                interceptSendToEndpoint("log:bar").to("mock:bar");
            }
        });
    }

}

Предупреждение для посетителей из будущего: В этом тестовом примере показано, как перехватить log: конечные точки с mock: иустановить ожидания от них. Тестовый пример может не проверять ничего стоящего.

1 голос
/ 10 октября 2019

Вот ссылка на примеры модульного тестирования для компонента Mock. В нем показано, как реализовать тесты с mock: конечными точками и CamelTestSupport. @ Роман Воттнер совершенно прав в своем комментарии.

Этот тестовый пример может представлять особый интерес для вас, поскольку он показывает, как поменять конечную точку smtp: наконечная точка mock:. Кроме того, здесь является официальной документацией о том, как макетировать существующие конечные точки (чтобы использовать их как тестовые зонды).

Предостережение. Обратите внимание, что в этом регионе API Camel 3.0 сильно отличается от API Camel 2.x. Удачи!

...