2016-04-21 10 views
1

Ich schreibe eine Anwendung mit Kamel für die Bereitstellung (schließlich) in einem Sicherungscontainer. Die Art des Projekts erfordert, dass ich Java und XML DSL mische und vergleiche.Wie mock ich Endpunkte mit Blaupause in Kamel?

Ich habe Probleme, das Mock Framework ordnungsgemäß mit Blueprint zu arbeiten.

Hier ist mein Komponententest, komplett basierend auf dem Beispiel here.

public class MockNotWorking extends CamelBlueprintTestSupport { 

    @Test 
    public void testAdvisedMockEndpointsWithPattern() throws Exception { 

    context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
      mockEndpoints("log*"); 
     } 
    }); 

    getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World"); 
    getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); 

    template.sendBody("direct:start", "Hello World"); 

    // additional test to ensure correct endpoints in registry 
    assertNotNull(context.hasEndpoint("direct:start")); 
    assertNotNull(context.hasEndpoint("log:foo")); 
    assertNotNull(context.hasEndpoint("mock:result")); 
    // only the log:foo endpoint was mocked 
    assertNotNull(context.hasEndpoint("mock:log:foo")); 
    assertNull(context.hasEndpoint("mock:direct:start")); 
    assertNull(context.hasEndpoint("mock:direct:foo")); 

    assertMockEndpointsSatisfied(); 

    } 


    @Override 
    protected RouteBuilder createRouteBuilder() throws Exception { 
    return new RouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
       from("direct:start").to("direct:foo").to("log:foo").to("mock:result"); 

      from("direct:foo").transform(constant("Bye World")); 
     } 
    }; 
    } 

    protected String getBlueprintDescriptor() { 
    return "OSGI-INF/blueprint/blueprint.xml"; 
    } 
} 

Ich habe wörtlich das Beispiel here kopiert und modifiziert es sehr leicht so erweitern wir CamelBlueprintTestSupport statt CamelTestSupport. Dies erfordert getBlueprintDescriptor über Reiten meinen Plan xml-zu-Punkt, in dem ich eine sehr einfach definiert habe (und völlig irrelevant für den Test) Route:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> 

<camelContext id="validationRoute" xmlns="http://camel.apache.org/schema/blueprint" > 

    <route id="validation"> 
     <from uri="direct:validation" /> 
     <log message="validating..." /> 
    </route> 
</camelContext> 

</blueprint> 

Der Test schlägt fehl mit:

java.lang.AssertionError: mock://log:foo Received message count. Expected: <1> but was: <0> 

Das bedeutet also, dass die Nachricht den falschen Endpunkt nicht erreicht hat. Ändern CamelBlueprintTestSupport für CamelTestSupport und es funktioniert.

Also, wie bekomme ich Mocks wie dies funktioniert mit Blueprint richtig?

Antwort

0

Wenn Sie Blueprint verwenden, importiert es alle Routen, die Sie in den Blueprint-XML-Dateien definiert haben, und fügt sie zu CamelContext hinzu.

Der Grund dafür ist, dass die context.getRouteDefinitions().get(0) nicht mehr auf die einzige Route verweist - es gibt jetzt mehr als eine. Wenn Sie also die AdviceWithRouteBuilder hinzufügen, könnte es zur falschen Route hinzugefügt werden.

Der folgende Code behebt das Problem (und wird auch für nicht-Plan Tests funktionieren):

List<RouteDefinition> routes = context.getRouteDefinitions(); 
    for (int i=0; i<routes.size(); i++) { 
     context.getRouteDefinitions().get(i).adviceWith(context, new AdviceWithRouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       // mock all endpoints 
       mockEndpoints("log*"); 
      } 
     }); 
    } 

====== ====== Update

einen besseren Weg, Tun Sie dies, anstatt alle Routen zu verspotten, finden Sie unsere spezifische Route nach ID und wenden Sie dann den Ratschlag an. Dies bedeutet Einstellung zuerst die Route ID:

from("direct:start").routeId("start").to("direct:foo").to("log:foo").to("mock:result"); 

Und dann die Strecke von id sucht und ruft adviceWith wie zuvor:

context.getRouteDefinition("start").adviceWith(context, new AdviceWithRouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
      // mock log endpoints 
      mockEndpoints("log*"); 
     } 
    }); 
0

Eigentlich hängt es davon ab, welche Version von Camel Sie verwenden, einige Methoden funktioniert nicht wie erwartet. Es hat sich nach dem 2.12 viel besser verbessert, wenn ich mich recht erinnere. (2.15 ist viel besser)

Nachdem alle meine Begegnungen mit Camel Unit-Tests, landete ich hier, um alle Stoffe dokumentieren bis:

http://bushorn.com/unit-testing-apache-camel/

http://bushorn.com/camel-unit-testing-using-mock-endpoint/

By the way, statt dieser „mockEndpoints ("log *"); ", würde ich folgendes tun:

weaveByToString (".direct: foo Mock. ") Nach() bis (..": Log "), (Das klingt seltsam, ich weiß;))

oder wenn Sie einen Endpunkt-ID

weaveById einstellen ("Endpunkt-ID-of-direct-foo") nach() bis ("mock: log");

oder

weaveAddLast() bis (... "mock: log");