2016-03-21 3 views
0

Ich kann nicht verstehen, warum meine Tests nicht funktionieren. Ich versuche abzufangen und überspringe das Senden an den Endpunkt, bei dem es sich um eine Bean-Referenz handelt und nichts passiert. Ich benutze Version 2.16.2.Apache Kamel. InterceptSendTo funktioniert nicht mit Bean Endpunkt

Test-camel.xml

<bean id="eb" class="com.rencap.emf.bpipe.EndpointBean"/>  
<camel:camelContext xmlns="http://camel.apache.org/schema/spring"> 
    <camel:endpoint id="requestEP" uri="direct:request"/> 
    <endpoint id="beanEP" uri="bean:eb?method=processMessage" /> 
    <camel:route id="testRoute"> 
     <camel:from ref="requestEP"/> 
     <camel:to ref="beanEP" /> 
    </camel:route> 
</camel:camelContext> 

EndpointBean.java

package com.rencap.emf.bpipe; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class EndpointBean { 
    private static Logger LOG = LoggerFactory.getLogger(EndpointBean.class); 

    public void processMessage(String msg){ 
     LOG.info("Processing message: {} ",msg); 
    } 
} 

Unit-Test:

@EndpointInject(ref="requestEP") 
ProducerTemplate requestEP; 
@EndpointInject(ref="beanEP") 
ProducerTemplate beanEP; 
@Autowired 
ModelCamelContext camelContext; 
@Test 
public void test() throws Exception{ 

    camelContext.getRouteDefinition("testRoute").adviceWith(camelContext , new AdviceWithRouteBuilder(){ 
     @Override 
     public void configure() throws Exception { 
      interceptSendToEndpoint(beanEP.getDefaultEndpoint().getEndpointUri()). 
       to("mock:send"). 
       skipSendToOriginalEndpoint(); 
     } 
    });  
    TestUtils.waitingFor("Configuration applied", 2000); 

    MockEndpoint mockEP = camelContext.getEndpoint("mock:send",MockEndpoint.class); 
    mockEP.setExpectedCount(1); 

    requestEP.sendBody("Message"); 

    mockEP.assertIsSatisfied(); 

    TestUtils.waitingFor("All rows commited", 2000); 
} 

-Test immer versagt. Protokolle:

13:11:02.512 [main] INFO o.apache.camel.model.RouteDefinition - AdviceWith route after: Route(testRoute)[[From[ref:requestEP]] -> [InterceptSendToEndpoint[bean://eb?method=processMessage -> [To[mock:send]]], To[ref:beanEP]]] 
13:11:02.537 [main] INFO o.a.camel.spring.SpringCamelContext - Route: testRoute started and consuming from: Endpoint[direct://request] 
13:11:02.538 [main] INFO com.rencap.emf.bpipe.test.TestUtils - Wait 2000 ms. Configuration applied 
13:11:04.554 [main] INFO com.rencap.emf.bpipe.EndpointBean - Processing message: Message 
13:11:04.556 [main] INFO o.a.c.component.mock.MockEndpoint - Asserting: Endpoint[mock://send] is satisfied 

Es bedeutet, dass bis zum Endpunkt zu senden ist nicht abgefangen werden und übersprungen. Vielleicht verstehe ich etwas nicht, aber ich konnte keine Einschränkung bei der Verwendung dieser Methode finden.

Zusätzlich habe ich das gleiche Problem für Endpunkt mit Protokoll festgestellt. Wenn ich beeEP on ersetzen:

<endpoint id="beanEP" uri="log:LOGMESSAGE" /> 

, dass ich das gleiche Ergebnis erhalte. Aber wenn ich es ersetzen auf

<endpoint id="beanEP" uri="seda:send" /> 

und neue Route hinzufügen:

<camel:route id="route2"> 
     <camel:from ref="sendEP"/> 
     <camel:log message="msg received ${body}"/> 
    </camel:route> 

, dass ich Ergebnis und Test erhalten erwartet wird successed werden.

Was mache ich falsch? Oder gibt es Einschränkungen bei dieser Methode?

Antwort

0

Ich wurde empfohlen, isUseAdviceWith zu überschreiben. In meinem Fall sieht es so aus:

public class TestTest extends CamelSpringTestSupport { 
    @Test 
    public void test() throws Exception{ 
     Endpoint beanEP = context.getEndpoint("beanEP"); 
     Endpoint requestEP = context.getEndpoint("requestEP"); 
     context.getRouteDefinition("testRoute").adviceWith(context , new AdviceWithRouteBuilder(){ 
      @Override 
      public void configure() throws Exception { 
       interceptSendToEndpoint(beanEP.getEndpointUri()). 
        to("mock:send"). 
        skipSendToOriginalEndpoint(); 
      } 
     });  
     context.start(); 
     TestUtils.waitingFor("Configuration applied", 2000); 
     MockEndpoint mockEP = context.getEndpoint("mock:send",MockEndpoint.class); 
     mockEP.setExpectedCount(1); 
     context.createProducerTemplate().sendBody(requestEP, "Message"); 
     mockEP.assertIsSatisfied(); 
     TestUtils.waitingFor("All rows commited", 2000); 
    } 
    @Override 
    protected AbstractApplicationContext createApplicationContext() { 
     return new ClassPathXmlApplicationContext("test-camel.xml"); 
    } 
    @Override 
    public boolean isUseAdviceWith(){ 
     return true; 
    } 
} 

Es funktioniert.

Aber ich würde gerne Anmerkungen verwenden, aber this funktioniert jetzt nicht für mich.