【问题标题】:Camel unit testing with MockEndPointsandSkip使用 MockEndPointsandSkip 进行骆驼单元测试
【发布时间】:2017-12-27 17:09:18
【问题描述】:

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

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

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

这是我的测试代码,它未能收到 1 Exchange 的断言。生产者似乎从未将消息发送到我的 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();

    }

}

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    如果您希望它是正则表达式,那么您的模拟端点就是错误的。

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

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

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

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

    【讨论】:

    • 非常感谢。它在您建议的更改后起作用。我上面列出的 2 条路由的一个问题,当我模拟“direct:notify”端点并从我的第一个路由(在 mock:direct:notify)接收交换时,第二个路由没有启动......为什么就是它?。我本来希望日志“direct:notify”,但第二条路线从未启动。
    • 因为您使用 ..AndSkip 它跳过发送到该端点。使用没有 AndSkip 的也可以发送。
    • 我的理解是 MockEndpointAndSkip 将添加“mock:direct:notify”端点,并将跳过将交换发送到原始端点“direct:notify”,但会将交换发送到“mock:直接:通知”。所以我的第二条路由,以“direct:notify”开头,也会添加“mock:direct:notify”,我假设从我的第一条路由在这个模拟端点收到的交换将被发送到模拟端点在第二条路线?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多