@MockEndpointsAndSkip无法解析动态模式

时间:2017-07-20 17:30:57

标签: apache apache-camel

我正在尝试使用camel路由应用程序为Spring Boot编写单元测试。我的路由生产者是Kafka端点,URI在application.properties文件中定义。我试图模拟这个Kafka生产者端点,但它没有解析URI值。

@RunWith(SpringRunner.class)
@SpringBootTest
@MockEndpointsAndSkip("kafka:${kafka.servers}?*")
public class MyApplicationTests {
    @Autowired
    private CamelContext camelContext;
      ........
      //Some debug code
      // list available endpoints
      camelContext.getEndpoints().forEach((Endpoint endpoint) -> log.info("Endpoint="+endpoint));
      .............
}

在上面的pseduocode中,@ mockEndpointsAndSkip注释的kafka.servers值在application.properties文件中定义为 kafka.servers =本地主机:9092

当我打印端点列表时,我看到未解析的值 端点=模拟://卡夫卡:$%7Bkafka.servers%7D

我希望: 端点=模拟://卡夫卡:本地主机:9092

这是错误的做法吗?

Thanx事先提供任何帮助!!

模拟测试的问题(抱歉是骆驼新手)

这是我想要使用MockEndpoints进行单元测试的Camel路由:

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

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

这是我的测试代码,它无法接收1个Exchange的断言。看来Producer永远不会将消息发送到我的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();

    }

}

1 个答案:

答案 0 :(得分:0)

您应该使用Camel的属性占位符语法

{{key}}

所以它应该是

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

请参阅以下文档:http://camel.apache.org/using-propertyplaceholder.html

Camel无法使用${key}与Spring发生冲突:http://camel.apache.org/how-do-i-use-spring-property-placeholder-with-camel-xml.html