单元测试骆驼/RabbitMQ路由问题 [英] Unit testing Camel/RabbitMQ routes issue

查看:17
本文介绍了单元测试骆驼/RabbitMQ路由问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在单元测试使用Rabbitmq作为代理的骆驼路由时遇到问题。

我已经研究了几个星期了,但还没有找到有效的方法来做到这一点。

首先,我在测试中没有调用rabbitmq时遇到了问题,并且将其保留为单元测试而不是集成测试。这是通过使用visicewith并将队列切换为模拟队列来实现的。

但是,使用以下代码时,消息不会到达结果队列或结束队列(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();
    }

}

推荐答案

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);

这篇关于单元测试骆驼/RabbitMQ路由问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆