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您的测试在我看来更像是一个集成测试,而不是单元测试。我接受您的回答,因为它提供了两种方法来实现我想要的。然而,我更多的是在我的回答中提出了类似的东西。鉴于它是如此具有侵略性,我不能选择其中一个作为最好的,我真的很想听到骆驼是改进的,以支持这种开箱即用的测试。请参阅我答案顶部的建议。这是一个类似问题的答案: