Apache骆驼路由中的单元测试日志节点

时间:2017-05-09 23:59:17

标签: apache-camel

假设我有以下骆驼路线:

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

你如何测试消息"收到Camel rock!"发送"骆驼岩石时会记录消息!"消息到直接:开始端点

3 个答案:

答案 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");
    }
}