我正在尝试使用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();
}
}
答案 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