Apache camel 使用MockEndPointsandSkip的驼峰单元测试

Apache camel 使用MockEndPointsandSkip的驼峰单元测试,apache-camel,Apache Camel,我是一个新手,正在尝试一些代码来理解MockEndpoints功能是如何工作的,但它不起作用。下面是我想使用MockEndpoints进行单元测试的Camel路由。属性值在application.properties文件中定义 from("kafka:{{kafka.servers}}?topic={{kafka.consumer.topic}}&groupId={{kafka.consumer.groupId}}") .to("direct:notify"); from("d

我是一个新手,正在尝试一些代码来理解MockEndpoints功能是如何工作的,但它不起作用。下面是我想使用MockEndpoints进行单元测试的Camel路由。属性值在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();

    }

}

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

@MockEndpointsAndSkip("kafka:{{kafka.servers}}?*|direct:notify")
注意在正则表达式中使用
*
。由于它不是通配符,通常需要使用
*
来匹配0..n个字符。更多地了解正则表达式,也许可以使用正则表达式测试仪,您可以在线找到它,或者在Java编辑器中作为插件安装它

另外,如果您想用卡夫卡替换开始的路由,则需要执行其他操作,因为
@MockEndpointsAndSkip
不适用于开始。但是为了送。请参阅“测试建议”部分中的关于
replaceFrom


我的书《行动中的骆驼》第二版在整个测试章节中提供了更多的文档:如果您正在寻找优秀的骆驼文档。

非常感谢您。在您建议的更改之后,它起作用了。我上面列出的两条路由的一个问题是,当我模拟“direct:notify”端点并从第一条路由接收交换(在mock:direct:notify上)时,第二条路由不会启动。。。为什么?。我本来希望日志是“direct:notify”,但第二条路由从未被引入。因为您使用..和skip,它将跳过发送到该端点的消息。使用不带AndSkip的端点也发送。我的理解是,MockEndpointAndSkip将添加“mock:direct:notify”端点,并将跳过将交换发送到原始端点“direct:notify”,而是将交换发送到“mock:direct:notify”。因此,我的第二个路由(以“direct:notify”开头)也将添加“mock:direct:notify”,并且我假设在这个模拟端点从我的第一个路由接收到的交换将被发送到第二个路由中的模拟端点?