2017-09-11 3 views
0

Ich versuche, meinen onException-Code zu testen, aber er wird nicht im Komponententest ausgelöst. Ich kann die Ausnahme in der Route doCatch(), aber sonst wird es nur an den Unit-Test-Code zurückgegeben. Ich habe es auf wenig mehr als eine hardcoded throwException() und log() -Anweisung gekocht, aber kein Glück. Camel verwenden 2.17.1.Camel onException() nicht ausgelöst

irgendwelche Ideen?

Route:

@Component 
public class BookingSummaryRouteBuilder extends RouteBuilder { 
[...] 
@Override 
public void configure() throws Exception { 

    errorHandler(killSwitchErrorHandlerBuilder); 

    onException(Exception.class) 
      .description("We can get here functional exception and we mustn't send any mail in this case.") 
      .log(LoggingLevel.INFO, "blahblah") 
      .handled(true) 
      /*.filter().method(exceptionAnalyserService, "isFunctionalException(${exception})") 
       .to(DIRECT_FUNCTIONAL_EXCEPTION) 
       .stop() 
      //not functional exception*/ 
      .to("direct:dlq.fatal-error") 
    ; 

    from("activemq:queue:routemod.spot-booking.summary?concurrentConsumers=1") 
      .routeId(BOOKING_SUMMARY_ENTRY_ROUTE) 
      .description("Requests and receives a booking summary report") 
      .log(LoggingLevel.INFO, "blah") 
      .throwException(new ConfigurationException("something")) 
    ; 

Unit-Test:

public class BookingSummaryRequestRouteTest extends CamelTestSupport { 
[...] 
private static final String MOCKED_ENTRYPOINT = "direct:mock-entry"; 

//under test 
@InjectMocks 
private BookingSummaryRouteBuilder builder; 
[...] 
@Override 
public boolean isUseAdviceWith() { 
    return true; 
} 

@Before 
public void setUpAdviceWith() throws Exception { 

    AdviceWithRouteBuilder adviceWithConfig = new AdviceWithRouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
      replaceFromWith(MOCKED_ENTRYPOINT); 
      interceptSendToEndpoint("tofalink:dummy") 
        .skipSendToOriginalEndpoint() 
        .to(toFalink); 
      } 
    }; 

    context.getRouteDefinition(builder.BOOKING_SUMMARY_ENTRY_ROUTE).adviceWith(context, adviceWithConfig); 
    context.start(); 
} 


@Override 
protected RouteBuilder createRouteBuilder() throws Exception { 
    MockitoAnnotations.initMocks(this); 

    builder.setDiffsEndpoint(diffsEndpoint); 
    builder.setMainframeFacxml(mainframeFacxml); 

    return builder; 
} 

/** 
* No agency found 
*/ 
@Test 
public void thatGeneralExceptionRouteInvokedWhenThereIsNoAgency() throws InterruptedException { 
    deadLetterChannel.expectedMessageCount(1); 
    diffsEndpoint.expectedMessageCount(0); 
    doThrow(new ConfigurationException("test")) 
      .when(agencyFalinkController).loadByAlphaID(any()); 

    template.sendBodyAndHeader(MOCKED_ENTRYPOINT, BSH_ID, "scheduleRevisionId", SCHEDULE_REVISION_ID); 


    verifyZeroInteractions(killSwitchErrorHandlerBuilder); 
    diffsEndpoint.assertIsSatisfied(); 
    deadLetterChannel.assertIsSatisfied(); 

} 

Logausgabe:

2017-09-13 09:49:52,692 INFO Log4j appears to be running in a Servlet environment, but there's no log4j-web module available. If you want better web container support, please add the log4j-web JAR to your web archive or server lib directory. 
2017-09-13 09:49:52,781 INFO main routes.BookingSummaryRequestRouteTest:220 - ******************************************************************************** 
2017-09-13 09:49:52,782 INFO main routes.BookingSummaryRequestRouteTest:221 - Testing: thatGeneralExceptionRouteInvokedWhenThereIsNoAgency(com.mediaocean.spectra.mediaservices.routes.BookingSummaryRequestRouteTest) 
2017-09-13 09:49:52,782 INFO main routes.BookingSummaryRequestRouteTest:222 - ******************************************************************************** 
2017-09-13 09:49:53,103 WARN main converter.DefaultTypeConverter:165 - Overriding type converter from: InstanceMethodTypeConverter: public java.lang.Class com.mediaocean.falink.converters.BasicConverters.convertClass(java.lang.String) throws java.lang.ClassNotFoundException to: StaticMethodTypeConverter: public static java.lang.Class com.mediaocean.spectra.killswitch.routes.converters.BasicConverters.convertClass(java.lang.String) throws java.lang.ClassNotFoundException 
2017-09-13 09:49:53,123 INFO main converter.DefaultTypeConverter:56 - Loaded 194 type converters 
2017-09-13 09:49:53,519 INFO main routes.BookingSummaryRequestRouteTest:333 - Skipping starting CamelContext as isUseAdviceWith is set to true. 
2017-09-13 09:49:53,524 INFO main builder.AdviceWithTasks:336 - AdviceWith replace input from [activemq:queue:routemod.spot-booking.summary?concurrentConsumers=1] --> [direct:mock-entry] 
2017-09-13 09:49:53,534 INFO main model.RouteDefinition:292 - AdviceWith route after: Route(bookingSummaryEntrypoint)[[From[direct:mock-entry]] -> [OnException[[class java.lang.Exception] -> [Log[blahblah], To[direct:dlq.fatal-error]]], InterceptSendToEndpoint[direct:dlq.fatal-error -> [To[mock://dlq.fatal-error]]], InterceptSendToEndpoint[fromfalink:bar -> [To[mock://fromFalink]]], InterceptSendToEndpoint[tofalink:dummy -> [To[mock://toFalink]]], ThrowException[mo.core.exception.ConfigurationException], SetHeader[scheduleRevisionLogId, simple{Simple: revisionId=${header.scheduleRevisionId}}], SetHeader[shortDescription, simple{Simple: request summary for revision ${header.scheduleRevisionId}}], Log[${header.scheduleRevisionLogId} Starting booking summary request], SetHeader[burstSaleshouse, simple{Simple: ${body}}], Filter[{header{summaryWorkflow} != isSummaryRefresh} -> [Bean[statusService]]], Bean[falinkController], Log[${header.scheduleRevisionLogId} Headers after FALink is set: ${headers}], Bean[bookingSummaryRequestController], Log[${header.scheduleRevisionLogId} After bookingSummaryRequestController: ${body}], Bean[falinkAssistant], Log[${header.scheduleRevisionLogId} XML version of request: ${body}], To[tofalink:dummy], Log[${header.scheduleRevisionLogId} FALink version: ${body}], Bean[agencyFalinkController], To[mock://mainframe.facxml], RemoveHeader[password], Log[BSH ${header.burstSaleshouse}, Revision ${header.scheduleRevisionLogId} Received booking summary], Log[${header.scheduleRevisionLogId} Booking summary request after tomainframe: ${body}], To[fromfalink:bar], Log[${header.scheduleRevisionLogId} Booking summary request after fromfalink: ${body}], Bean[falinkAssistant], Log[${header.scheduleRevisionLogId} Booking summary request after falinkAssistant: ${body}], Bean[bookingSummaryResponseController], SetBody[simple{Simple: $body.burstSaleshouseId}], Log[BODY IS: ${body}], RemoveHeaders[*], To[mock://activemq:diffs]]] 
2017-09-13 09:49:53,535 INFO main impl.DefaultCamelContext:2794 - Apache Camel 2.17.1 (CamelContext: camel-1) is starting 
2017-09-13 09:49:53,537 INFO main management.DefaultManagementStrategy:238 - JMX is disabled 
2017-09-13 09:49:53,690 INFO main impl.DefaultCamelContext:3033 - AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance. 
2017-09-13 09:49:53,690 INFO main impl.DefaultCamelContext:3043 - StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html 
2017-09-13 09:49:53,712 INFO main impl.DefaultCamelContext:3564 - Route: bookingSummaryEntrypoint started and consuming from: Endpoint[direct://mock-entry] 
2017-09-13 09:49:53,712 INFO main impl.DefaultCamelContext:3564 - Route: route1 started and consuming from: Endpoint[direct://functionalException] 
2017-09-13 09:49:53,713 INFO main impl.DefaultCamelContext:2834 - Total 2 routes, of which 2 are started. 
2017-09-13 09:49:53,714 INFO main impl.DefaultCamelContext:2835 - Apache Camel 2.17.1 (CamelContext: camel-1) started in 0.178 seconds 
2017-09-13 09:54:13,443 INFO main bookingSummaryEntrypoint:159 - blah 
2017-09-13 09:49:53,772 INFO main routes.BookingSummaryRequestRouteTest:363 - ******************************************************************************** 
2017-09-13 09:49:53,772 INFO main routes.BookingSummaryRequestRouteTest:364 - Testing done: thatGeneralExceptionRouteInvokedWhenThereIsNoAgency(com.mediaocean.spectra.mediaservices.routes.BookingSummaryRequestRouteTest) 
2017-09-13 09:49:53,772 INFO main routes.BookingSummaryRequestRouteTest:365 - Took: 0.253 seconds (253 millis) 
2017-09-13 09:49:53,772 INFO main routes.BookingSummaryRequestRouteTest:392 - ******************************************************************************** 
2017-09-13 09:49:53,772 INFO main impl.DefaultCamelContext:3060 - Apache Camel 2.17.1 (CamelContext: camel-1) is shutting down 
2017-09-13 09:49:53,773 INFO main impl.DefaultShutdownStrategy:196 - Starting to graceful shutdown 2 routes (timeout 10 seconds) 
2017-09-13 09:49:53,778 INFO Camel (camel-1) thread #0 - ShutdownTask impl.DefaultShutdownStrategy:669 - Route: route1 shutdown complete, was consuming from: Endpoint[direct://functionalException] 
2017-09-13 09:49:53,778 INFO Camel (camel-1) thread #0 - ShutdownTask impl.DefaultShutdownStrategy:669 - Route: bookingSummaryEntrypoint shutdown complete, was consuming from: Endpoint[direct://mock-entry] 
2017-09-13 09:49:53,779 INFO main impl.DefaultShutdownStrategy:260 - Graceful shutdown of 2 routes completed in 0 seconds 
2017-09-13 09:49:53,782 INFO main impl.DefaultCamelContext:3145 - Apache Camel 2.17.1 (CamelContext: camel-1) uptime 0.247 seconds 
2017-09-13 09:49:53,782 INFO main impl.DefaultCamelContext:3146 - Apache Camel 2.17.1 (CamelContext: camel-1) is shutdown in 0.010 seconds 

org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[ID-LO-PC-NRAK-53517-1505292592827-0-2] 

at org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1706) 
at org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:660) 
at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:471) 
at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:467) 
at org.apache.camel.impl.DefaultProducerTemplate.sendBodyAndHeader(DefaultProducerTemplate.java:165) 
at org.apache.camel.impl.DefaultProducerTemplate.sendBodyAndHeader(DefaultProducerTemplate.java:159) 
at com.mediaocean.spectra.mediaservices.routes.BookingSummaryRequestRouteTest.thatGeneralExceptionRouteInvokedWhenThereIsNoAgency(BookingSummaryRequestRouteTest.java:240) 
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:483) 
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.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55) 
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55) 
at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
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.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 
Caused by: mo.core.exception.ConfigurationException: something 
at com.mediaocean.spectra.mediaservices.routes.BookingSummaryRouteBuilder.configure(BookingSummaryRouteBuilder.java:83) 
at org.apache.camel.builder.RouteBuilder.checkInitialized(RouteBuilder.java:403) 
at org.apache.camel.builder.RouteBuilder.configureRoutes(RouteBuilder.java:343) 
at org.apache.camel.builder.RouteBuilder.addRoutesToCamelContext(RouteBuilder.java:326) 
at org.apache.camel.impl.DefaultCamelContext$1.call(DefaultCamelContext.java:835) 
at org.apache.camel.impl.DefaultCamelContext$1.call(DefaultCamelContext.java:832) 
at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:2867) 
at org.apache.camel.impl.DefaultCamelContext.addRoutes(DefaultCamelContext.java:832) 
at org.apache.camel.test.junit4.CamelTestSupport.doSetUp(CamelTestSupport.java:326) 
at org.apache.camel.test.junit4.CamelTestSupport.setUp(CamelTestSupport.java:239) 
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:483) 
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.RunBefores.evaluate(RunBefores.java:24) 
+1

Schwer zu sagen, ohne die Protokolle zu debuggen und zu sehen, aber sehen Sie sich die Komponententests an. Sie geben normalerweise Hinweise auf ihre innere Arbeit. https://github.com/apache/camel/blob/master/camel-core/src/test/java/org/apache/camel/processor/onexception/OnExceptionRouteTest.java –

+0

Wohin senden Sie tatsächlich eine Nachricht auf der Route? ? – Julian

+0

Schlägt der Test fehl? – user3206236

Antwort

0

Ah, konnte ich auf diese Fortschritte machen. Das Problem scheint mit meinem errorHandlerBuilder zu sein. Ich ersetzte den Killswitch mit einem Basic LoggingErrorHandler() und die onException Log-Anweisung löst nun aus.

Mein KillSwitchErrorHandlerBuilder ist ein @Mock, und ich habe es nicht programmiert, um einen ErrorHandler zurückzugeben - da ich nicht erwartet hatte, dass es in diesem Test ausgelöst wird. Aber ich denke, es bricht den Kontext, wenn es eine Null zurückgibt.

UPDATE fixiert, indem ein DefaultErrorHandlerBuilder im RouteBuilder anstelle einer mock Einstellung.

Verwandte Themen