【问题标题】:Unit testing log nodes in Apache camel routesApache骆驼路由中的单元测试日志节点
【发布时间】:2017-05-09 23:59:17
【问题描述】:

假设我有以下骆驼路线:

.from("direct:start")
.log("received ${body} message")
.to("mock:end");

您将如何测试“收到骆驼岩石!”的消息?当您发送“骆驼岩石!”时会记录消息。发送到 direct:start 端点的消息

【问题讨论】:

标签: apache-camel


【解决方案1】:

我会阅读写好的文件。或者向日志系统添加一个自定义附加程序并断言它收到了消息。

或查看Camel's internal unit tests

但是你到底想达到什么目的呢?
你应该测试你的应用程序而不是你正在使用的框架。

【讨论】:

  • 感谢内部单元测试的建议。我会跟进,看看我是否有一些想法。至于用例问题,在某些情况下,应用程序会发送一些具有业务含义的特殊日志条目;例如当出现问题时,这些日志条目可能会唤醒支持人员。与其在系统到达测试环境时延迟测试此功能,我更希望能够使用在我推动更改时一直运行的单元测试来测试它。希望这是有道理的。
  • 是的,你如何测试 Java 的 System.out.println 正在打印我输入的内容;)。它不值得努力。并且您在日志之后有一个模拟端点,您可以在其中断言 1 条消息到达,并且消息中的内容符合预期。如果您真的想测试日志,请设置记录器以写入文件,然后读取该文件并检查其内容。
  • @Julian 你的测试在我看来更像是集成测试而不是单元测试。
  • 我接受您的回答,因为它提供了两种实现我想要的方法。但是,我更喜欢我的回答中提出的内容。给出它是如此具有侵入性,我不能选择那个是最好的,并且真的很想听到骆驼得到改进以支持这种开箱即用的测试。在我的答案顶部查看我的建议。
  • 我和OP的情况一样。我相信 OP 只是想断言对记录器的调用,而不是实际记录器的行为。在某些情况下,日志调用可能是有条件的。在这些情况下,您的单元测试应确保在适当的情况下调用适当的记录器。
【解决方案2】:

我不会测试实际的日志记录部分,但是为什么不将您感兴趣的数据保存在某个属性或标头中,然后在您的单元测试中断言该属性或标头的值必须是这样那样?

【讨论】:

    【解决方案3】:

    这是一种测试方法,我承认这有点过于侵入性了。如果 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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      相关资源
      最近更新 更多