2017-07-18 68 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它。這對於監控是必要的,所以我必須編寫測試記錄某條消息。 –