使用 MockEndPointsandSkip 进行 Camel 单元测试 [英] Camel unit testing with MockEndPointsandSkip

查看:23
本文介绍了使用 MockEndPointsandSkip 进行 Camel 单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 Camel 新手,正在尝试一些代码来了解 MockEndpoints 功能的工作原理,但它不起作用.这是我想使用 MockEndpoints 进行单元测试的 Camel 路由.属性值在 application.properties 文件中定义.

Am a Camel newbie and am trying out some code to understand how the MockEndpoints functionality works, but it is not working. Here are my Camel routes that I want to unit test using MockEndpoints. The property values are defined in the application.properties file.

from("kafka:{{kafka.servers}}?topic={{kafka.consumer.topic}}&groupId={{kafka.consumer.groupId}}")
    .to("direct:notify");

from("direct:notify")
    .log("direct:notfy");

这是我的测试代码,它未能接受 1 个交换的断言.Producer 似乎从未将消息发送到我的 Kafka Mockendpoint:

Here is my Test code which is failing the assertion of receiving 1 Exchange. It appears that the Producer is never sending the message to my Kafka Mockendpoint:

@RunWith(SpringRunner.class)
@SpringBootTest
@MockEndpointsAndSkip("kafka:{{kafka.servers}}?*|direct:notify")
public class NotificationApplicationTests {     

    @Autowired
    private CamelContext context;

    @Value("${kafka.servers}")
    private String kafkaServers;

    @EndpointInject(uri="mock:kafka:{{kafka.servers}}")
    private MockEndpoint mockKafka;

    @EndpointInject(uri="mock:direct:notify")
    private MockEndpoint mockDirect;

    @Autowired
    private ProducerTemplate notiProducer;

    @Test
    public void testMockEndpoints() throws Exception{                                       

        mockDirect.setExpectedMessageCount(1);
        mockDirect.whenAnyExchangeReceived( (Exchange exchange) -> {
            //NEVER GETS HERE!!
            log.info("MOCK DIRECT exchange received");          
        });     

        String payload = "{'email': 'test@gmail.com', 'data': 'ABC1234'}";

        notiProducer.sendBody(mockKafka, payload);

        mockDirect.assertIsSatisfied();

    }

}

推荐答案

如果你期望它是一个正则表达式,你的模拟端点是错误的.

Your mock endpoint is wrong if you expect it to be a regular expression.

@MockEndpointsAndSkip("kafka:{{kafka.servers}}?*|direct:notify")

注意在正则表达式中使用 *.由于它不是通配符,您通常需要使用 .* 来匹配 0..n 个字符.多看看正则表达式,也许可以使用正则表达式测试器,您可以在网上找到它或将其作为插件安装在 Java 编辑器中.

Take care about using * in a regular expression. As its not a wildcard, you typically would need to use .* to match 0..n characters. Look at bit more on regular expression and maybe use a regular expression tester which you can find online or install as plugin in your Java editor.

另外,如果你想替换以 kafka 开头的路由,那么你需要做一些其他的事情,因为 @MockEndpointsAndSkip 不是一开始的.但是对于发送.请参阅建议测试部分中的 replaceFrom:http://camel.apache.org/advicewith.html.

Also if you want to replace the route starting with kafka, then you need to do something else as @MockEndpointsAndSkip is not for the start. But for sending. See about replaceFrom in the advice-with testing section: http://camel.apache.org/advicewith.html.

我的书 Camel in Action 2nd edition 在整个测试章节中有更多的文档:https://www.manning.com/books/camel-in-action-second-edition 如果您正在寻找优秀的 Camel 文档.

And my book Camel in Action 2nd edition has a lot more documentation in the entire testing chapter: https://www.manning.com/books/camel-in-action-second-edition if you are looking for great Camel documentation.

这篇关于使用 MockEndPointsandSkip 进行 Camel 单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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