2017-01-18 2 views
2

Ich teste Frühling Sicherheit in meinem Spring Boot, Camel-Anwendung. Wenn ich versuche, eine Route mit einem Autowired ProducerTemplate zu testen, wird eine Ausnahme mit der Meldung "Keine Endanwender am Endpunkt: direct: // secure" ausgelöst. Die Route ist innerhalb des Kamelkontextes richtig definiert.Spring Boot Camel Testing - Keine Verbraucher auf Endpoint verfügbar

RouteBuilder Code:

@Component 
public class SpringSecurityRoute extends RouteBuilder { 
    protected Logger logger = LoggerFactory.getLogger(SpringSecurityRoute.class); 

    @Override 
    public void configure() throws Exception { 

     from("direct:secure") 
      .process(new Processor() { 
       @Override 
       public void process(Exchange exchange) throws Exception { 
        logger.info("********************* Processing!"); 
       } 
      }); 
    } 
} 

Test-Klassencode:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class SpringSecurityRouteTest { 

    private static Logger logger = LoggerFactory.getLogger(SpringSecurityRouteTest.class); 

    @Autowired 
    ProducerTemplate producerTemplate; 

    @Test 
    public void testRoute() { 
     logger.info("Starting test."); 
     producerTemplate.sendBody("direct:secure", "body"); 
    } 
} 

Stacktrace:

org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[ID-xxxxxxxxxxxxxxx-51669-1484755486463-0-2] 

    at org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1706) 
    at org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:677) 
    at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:515) 
    at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:511) 
    at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:163) 
    at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:168) 
    at com.incomm.imp.neo.routes.SpringSecurityRouteTest.testRoute(SpringSecurityRouteTest.java:37) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: direct://secure. Exchange[ID-xxxxxxxxxxxxx-51669-1484755486463-0-2] 
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:55) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) 
    at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:529) 
    at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:497) 
    at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:365) 
    at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:497) 
    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:225) 
    at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:144) 
    at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:161) 
    ... 35 more 

Antwort

1

Das Problem ist, dass Kamel Kontext nicht initialisiert wird, bevor der Test durchgeführt wird. Wenn für den Kamelkontext eine Verzögerung hinzugefügt wird, um vor dem Ausführen des Tests bereit zu sein, verschwindet der Fehler. Ich habe den Test-Klassen den folgenden Code hinzugefügt, um dem Kamel-Kontext 5 Sekunden zu initialisieren. Die Ausnahme wird nicht mehr ausgelöst. Ich habe festgestellt, dass ohne die zusätzliche Verzögerung keine Protokollanweisungen gedruckt werden, die darauf hindeuten, dass die Route bereit ist.

11:23:11.440 [CamelMainRunController] INFO o.a.camel.spring.SpringCamelContext - Route: route3 started and consuming from: direct://secure 

Neuer Code hinzugefügt Testklasse:

private boolean isCamelContextInitialized = false; 

@Before 
public void initializeCamelContext() throws Exception { 
    if (!isCamelContextInitialized) { 
     logger.info("Waiting for Camel Context to become initialized."); 
     Thread.sleep(5000L); 
    } 
} 

Aktualisiert Testklasse Code:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class SpringSecurityRouteTest { 

    private static Logger logger = LoggerFactory.getLogger(SpringSecurityRouteTest.class); 
    private boolean isCamelContextInitialized = false; 

    @Before 
    public void initializeCamelContext() throws Exception { 
     if (!isCamelContextInitialized) { 
      logger.info("Waiting for Camel Context to become initialized."); 
      Thread.sleep(5000L); 
     } 
    } 

    @Autowired 
    ProducerTemplate producerTemplate; 

    @Test 
    public void testRoute() { 
     logger.info("Starting test."); 
     producerTemplate.sendBody("direct:secure", "body"); 
    } 
} 
Verwandte Themen