2017-07-18 69 views
0

我试图测试使用from(x).to(y).log("SuccessKey123")和​​的骆驼路由。阿帕奇骆驼 - 测试日志消息

如何在消息成功处理时测试Camel日志“SuccessKey123”,或者在抛出HttpOperationFailedException时记录“ErrorKey123”?

我RouteBuilder():

@Component 
public class myHttp4RouteBuilder extends SpringRouteBuilder { 
    public static final ID = "foo"; 

    @Override 
    public void configure() throws Exception { 

     onException(HttpOperationFailedException.class) 
       .log("ErrorKey123") 
       .to(ERROR_QUEUE) 
       .handled(true); 

     from(AWS_SQS_ENDPOINT) 
       .to(REST_API_ENDPOINT) 
       .log("SuccessKey123"); 
    } 
} 

的TestClass:

public class myHttp4RouteBuilderTest { 

    @Produce(uri = MOCK_ROUTE_FROM) 
    protected ProducerTemplate template; 

    @EndpointInject(uri = MOCK_ROUTE_TO) 
    private MockEndpoint mockEndpoint; 

    @Autowired 
    private CamelContext camelContext; 

    @Before 
    public void setup() throws Exception{ 
     RouteDefinition rd = camelContext.getRouteDefinition(myHttp4RouteBuilder.ID); 
     rd.adviceWith(camelContext, new AdviceWithRouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       replaceFromWith(MOCK_ROUTE_FROM); 

       weaveByToUri(ERROR_QUEUE) 
         .replace() 
         .to(MOCK_ROUTE_TO); 
      } 
     }); 
    } 

    @Test 
    @DirtiesContext 
    public void testSuccess() throws Exception { 
      // throw an HttpOperationFailedException 
     mockEndpoint.whenAnyExchangeReceived(new Processor() { 
      @Override 
      public void process(Exchange exchange) throws Exception { 
       throw new HttpOperationFailedException("Exception", 400, null, null, null, null); 
      } 
     }); 


     // 
     // 
     // How can I test here that camel logs "ErrorKey123" 
     // 
     // 


     template.sendBody(MOCK_ROUTE_FROM, "some content"); 

     mockEndpoint.assertIsSatisfied(); 

    } 
} 

非常感谢您!

+0

也看到这样的回答:https://stackoverflow.com/questions/1827677/how-to-do-a-junit-assert-on-a-message-in-a-logger –

回答

0

我把它;-)你把我的正确途径。谢谢!

这是我的解决方案:

第一:创建一个自定义追加程序

package de.example.test; 

import org.apache.logging.log4j.core.Filter; 
import org.apache.logging.log4j.core.Layout; 
import org.apache.logging.log4j.core.LogEvent; 
import org.apache.logging.log4j.core.appender.AbstractAppender; 
import org.apache.logging.log4j.core.appender.AppenderLoggingException; 
import org.apache.logging.log4j.core.config.plugins.Plugin; 
import org.apache.logging.log4j.core.config.plugins.PluginAttribute; 
import org.apache.logging.log4j.core.config.plugins.PluginElement; 
import org.apache.logging.log4j.core.config.plugins.PluginFactory; 
import org.apache.logging.log4j.core.layout.PatternLayout; 
import org.slf4j.event.LoggingEvent; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 


@Plugin(name="myAppenderForTesting", category="Core", elementType="appender", printObject=true) 
public class MyAppenderForTesting extends AbstractAppender { 

    /** Here we collect all log messages */ 
    public static List<LogEvent> logEvents = new ArrayList<>(); 

    protected MyAppenderForTesting(String name, Filter filter, Layout<? extends Serializable> layout, final boolean ignoreExceptions) { 
     super(name, filter, layout, ignoreExceptions); 
    } 
    @PluginFactory 
    public static MyAppenderForTesting createAppender(
      @PluginAttribute("name") String name, 
      @PluginElement("Layout") Layout<? extends Serializable> layout, 
      @PluginElement("Filter") final Filter filter, 
      @PluginAttribute("otherAttribute") String otherAttribute) { 

     return new MyAppenderForTesting(name, filter, layout, true); 

    } 
    @Override 
    public void append(LogEvent event) { 
     try { 
      logEvents.add(event); 
     } catch (Exception ex) { 
      if (!ignoreExceptions()) { 
       throw new AppenderLoggingException(ex); 
      } 
     } finally { 

     } 
    } 

    /** 
    * Clear log messages 
    */ 
    public static void clean() { 
     logEvents.clear(); 
    } 
} 

简短说明:用append()方法,我们每个日志事件添加到一个公共静态变量LOGEVENTS。在测试后期,我们可以访问logEvents。

让这个appender与log4j一起工作有点困难。在我的情况下,我在测试资源src\test\resources\log4j2.xml中创建了一个log4j2.xml

<?xml version="1.0" encoding="UTF-8" ?> 

<Configuration packages="de.example"> 
    <Appenders> 
     <myAppenderForTesting name="myAppenderForTesting"> 
      <PatternLayout alwaysWriteExceptions="false" pattern="%d{dd.MM.yyyy HH:mm:ss} %-5p %t [%C{1}.%M:%L] %m %ex{10000}%n" /> 
     </myAppenderForTesting> 
    </Appenders> 

    <Loggers> 
     <Root level="INFO"> 
      <AppenderRef ref="myAppenderForTesting"/> 
     </Root> 
    </Loggers> 
</Configuration> 

在我的测试班,我可以直接访问MyAppenderForTesting.logEvents。例如

for (LogEvent event : MyAppenderForTesting.logEvents) { 
     String message = event.getMessage().toString(); 
     if (message.contains(search)) { 
      // do somethind 
     } 
    } 
3

骆驼使用SLF4J所以你可以在设置中添加一些测试的appender到所需的记录,并检查了什么之后登录(甚至是模拟的appender接口)

0

您也可以使用骆驼的建议,与再嘲笑/用模拟等取代这些日志端点,然后只是断言骆驼根据你的操作将消息发送给那些人。

+0

嗯,我的目标是测试日志消息,所以我可以grep它。这对于监控是必要的,所以我必须编写测试记录某条消息。 –