2017-05-09 1 views
0

Angenommen, ich habe folgendes Kamel Route: „erhielt Camel Felsen“Unit-Tests Protokoll Knoten in Apache Kamel Routen

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

Wie würden Sie testen, ob die Nachricht Nachricht wird protokolliert, wenn Sie ein "Kamel rockt!" Nachricht an die direkte: Start Endpunkt

+0

Dies ist eine ähnliche Antwort auf die Frage: http://stackoverflow.com/questions/1827677/how-to-do-a-junit-assert-on-a -message-in-a-logger –

Antwort

1

Ich würde die geschriebene Datei lesen. Oder fügen Sie dem Protokollierungssystem einen benutzerdefinierten Appender hinzu, und bestätigen Sie, dass die Nachricht empfangen wurde.

Oder überprüfen Sie Camel's internal unit tests.

Aber was genau versuchen Sie zu erreichen?
Sie sollen Ihre Anwendung testen und nicht die Frameworks, die Sie verwenden.

+0

Vielen Dank für die interne Einheit Tests Vorschlag. Ich würde nachsehen und sehen, ob ich ein paar Ideen bekomme. Wie bei der Use-Case-Frage gibt es einige Situationen, in denen die Anwendung einige spezielle Protokolleinträge mit geschäftlichen Auswirkungen sendet; z.B. Wenn etwas schief geht, können diese Protokolleinträge einen Unterstützungsmann aufwecken. Anstatt das Testen dieser Funktionalität zu verzögern, wenn das System eine Testumgebung erreicht, würde ich es vorziehen, es mit einem Komponententest zu testen, der die ganze Zeit läuft, wenn ich eine Änderung durchführe. Ich hoffe es macht Sinn. – Julian

+0

Ja, wie testen Sie Java System.out.println druckt was ich tippte;). Es ist die Mühe nicht wert. Und Sie haben einen Schein-Endpunkt direkt nach dem Protokoll, wo Sie bestätigen können, dass 1 Nachricht angekommen ist und der Inhalt in der Nachricht wie erwartet ist. Wenn Sie das Protokoll wirklich testen möchten, richten Sie den Logger so ein, dass er in eine Datei schreibt, lesen Sie diese Datei und überprüfen Sie deren Inhalt. –

+0

@Julian Ihr Test scheint für mich eher ein Integrationstest als ein Komponententest zu sein. –

0

Ich würde den eigentlichen Protokollierungsteil nicht testen, aber warum nicht die Daten speichern, die Sie an einer Eigenschaft oder einem Header interessiert sind, und dann in Ihrem Komponententest bestätigen, dass der Wert dieser Eigenschaft oder des Headers so und so sein muss?

0

Hier ist eine Möglichkeit, dies zu testen, die ich zugeben, ist ein bisschen zu invasiv. Es wäre viel einfacher gewesen, wenn AdviceWithBuilder so etwas wie replaceWith(ProcessDefinition replacement) hinzugefügt hätte. Hier

ist das Arbeitsbeispiel:

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