假设我有以下骆驼路线:
.from("direct:start")
.log("received ${body} message")
.to("mock:end");
你如何测试消息"收到Camel rock!"发送"骆驼岩石时会记录消息!"消息到直接:开始端点
答案 0 :(得分:1)
我会阅读书面文件。或者将自定义appender添加到日志记录系统并声明它已收到消息。
或检查Camel's internal unit tests。
但你到底想要达到什么目的呢? 您应该测试您的应用程序,不您正在使用的框架。
答案 1 :(得分:0)
我不会测试实际的日志记录部分,但为什么不保存您感兴趣的属性或标题的数据,然后在单元测试断言该属性或标题的值必须是这样的?
答案 2 :(得分:0)
这是一种测试方法,我承认它有点过于侵入性。如果AdviceWithBuilder添加了类似replaceWith(ProcessDefinition replacement)
的内容,那将会容易得多。
以下是工作示例:
package com.my.org.some.pkg;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.testng.CamelTestSupport;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.springframework.test.util.ReflectionTestUtils;
import org.testng.annotations.Test;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class CamelLoggingTest extends CamelTestSupport {
@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").id("abc")
.log("received ${body} message")
.to("mock:stop");
}
};
}
@Test
public void shouldLogExpectedMessage() throws Exception {
Logger logger = Mockito.mock(Logger.class);
context.getRouteDefinition("abc").adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
ReflectionTestUtils.setField(context.getRouteDefinition("abc")
.getOutputs().get(0), "logger", logger);
}
});
when(logger.isInfoEnabled()).thenReturn(true);
sendBody("direct:start", "Camel rocks!");
verify(logger).info("received Camel rocks! message");
}
}