Apache camel apachecamel路由中的单元测试日志节点
假设我有以下骆驼路线:Apache camel apachecamel路由中的单元测试日志节点,apache-camel,Apache Camel,假设我有以下骆驼路线: .from("direct:start") .log("received ${body} message") .to("mock:end"); 当您向direct:start endpoint发送“Camel rocks!”消息时,您将如何测试消息“received Camel rocks!”消息是否被记录:我将读取写入的文件。或者向日志记录系统添加一个自定义附加器,并断言它已收到消息 或者支票 但你到底想达到什么目的呢? 您应该测试您的应用程序,而不是您正在使用的框架
.from("direct:start")
.log("received ${body} message")
.to("mock:end");
当您向direct:start endpoint发送“Camel rocks!”消息时,您将如何测试消息“received Camel rocks!”消息是否被记录:我将读取写入的文件。或者向日志记录系统添加一个自定义附加器,并断言它已收到消息 或者支票 但你到底想达到什么目的呢?
您应该测试您的应用程序,而不是您正在使用的框架。我不会测试实际的日志部分,但为什么不将您感兴趣的数据保存到属性或标题中,然后在您的单元测试中,断言该属性或头的值必须是某某?这里有一种测试方法,我承认这有点太过冒进了。如果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");
}
}
感谢内部单元测试的建议。我会跟进,看看是否有什么想法。对于用例问题,有些情况下应用程序会发送一些具有业务含义的特殊日志条目;e、 g.当出现问题时,这些日志条目可能会唤醒支持人员。与其在系统到达测试环境时延迟此功能的测试,我更希望能够使用在我推动更改时一直运行的单元测试来测试它。希望它有意义。是的,您如何测试Java的System.out.println正在打印我键入的内容;)。这不值得努力。在日志之后有一个模拟端点,可以断言有1条消息到达,消息中的内容与预期的一样。如果您真的想测试日志,请将日志记录器设置为写入一个文件,然后读取该文件并检查其内容。@Julian您的测试在我看来更像是一个集成测试,而不是单元测试。我接受您的回答,因为它提供了两种方法来实现我想要的。然而,我更多的是在我的回答中提出了类似的东西。鉴于它是如此具有侵略性,我不能选择其中一个作为最好的,我真的很想听到骆驼是改进的,以支持这种开箱即用的测试。请参阅我答案顶部的建议。这是一个类似问题的答案: