Модульное тестирование выпуска маршрутов Camel / RabbitMQ - PullRequest
0 голосов
/ 27 апреля 2018

У меня проблема модульное тестирование верблюжий маршрут, который использует rabbitmq для брокера.

Я искал много недель, но не нашел эффективного способа сделать это.

Во-первых, у меня возникла проблема с НЕ вызывающим rabbitmq в моем тесте, и это было модульным тестом, а не интеграционным тестом. Это было достигнуто с помощью advicewith и выключением очереди для ложных очередей.

Однако с помощью следующего кода сообщения не достигают результата или конечной очереди (MOBILE_QUEUE).

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


Вот мой маршрут , который импортирует rabbitmq.class

from(TEST_QUEUE).to(MOBILE_QUEUE).routeId("test2phone");

Мой конфиг rabbitmq.class

@Component
public class RabbitMQ extends Properties {

    public final String TEST_QUEUE = CreateRabbitMQQueue("TestQueue", "camel");
    public final String MOBILE_QUEUE = CreateRabbitMQQueue("MobileQueue", "camel");

    public static String CreateRabbitMQQueue(String QueueName, String RoutingKey)
    {
        String hostv;
        String portv;
        String username;
        String password;

        hostv = "mq-staging";
        portv = System.getenv("SERVICE_PORT_AMQP");
        username = System.getenv("V_RABBIT_USERNAME");
        password = System.getenv("V_RABBIT_PASSWORD");

        UriComponentsBuilder uriBuilder = UriComponentsBuilder
                .fromPath("/" )
                .scheme("rabbitmq")
                .host(hostv)
                .port(portv)
                .path("/" + QueueName)
                .queryParam("username",username)
                .queryParam("password", password)
                .queryParam("routingKey",RoutingKey)
                .queryParam("queue","Q" + QueueName);

        return uriBuilder.toUriString();
    }

}

И мой модульный тест

@RunWith(CamelSpringRunner.class)
@MockEndpoints
@UseAdviceWith
@SpringBootTest
public class RouteTester extends CamelTestSupport {

    String TEST_QUEUE;
    String MOBILE_QUEUE;

    @Autowired
    Routes routes;

    @Autowired
    CamelContext context;

    @Autowired
    ProducerTemplate template;

    @Before
    public void setUp() throws Exception {
        TEST_QUEUE = routes.getTEST_QUEUE();
        MOBILE_QUEUE = routes.getMOBILE_QUEUE();
        context.getRouteDefinition("test2phone").adviceWith(context, new Routes() {
            @Override
            public void configure() throws Exception {
                interceptSendToEndpoint(TEST_QUEUE)
                        .skipSendToOriginalEndpoint()
                        .to("mock:testQ");
                interceptSendToEndpoint(MOBILE_QUEUE)
                        .skipSendToOriginalEndpoint()
                        .to("mock:result");
            }
        });
        context.start();
    }

    @Test
    public void testTest() throws Exception {
        String body = "hello123";

        MockEndpoint resultEndpoint = context.getEndpoint("mock:result", MockEndpoint.class);

        resultEndpoint.expectedMessageCount(1);
        resultEndpoint.expectedBodiesReceived(body);
        template.sendBody(TEST_QUEUE, body);
        resultEndpoint.assertIsSatisfied();
    }

    @After
    public void TearDown() throws Exception {
        context.stop();
    }

}

1 Ответ

0 голосов
/ 27 апреля 2018

interceptSendToEndpoint полезно для перехвата выходной конечной точки. Вы, вероятно, хотите заменить входную конечную точку и перехватить выходную конечную точку. См. AdviceWith .

Это должно работать:

context.getRouteDefinition("test2phone").adviceWith(context, new AdviceWithRouteBuilder() {
    @Override
    public void configure() throws Exception {
        replaceFromWith("direct:test");
        interceptSendToEndpoint(MOBILE_QUEUE)
            .skipSendToOriginalEndpoint()
            .to("mock:result");
        }
});

И проверьте свой маршрут с помощью:

template.sendBody("direct:test", body);
...