Rainer Sinkwitz
Rainer Sinkwitz

Reputation: 1

How to throw exceptions from interceptSendToEndpoint handler in camel

I want to simulate HTTP exceptions for testing purposes in an integration test setting. I am using interceptSendToEndpoint. From the handler I can log, modify headers or body, but I can't throw any exception back into the intercepted route. They just get logged and that's it. They are not caught by an onException handler or doTry..doCatch block of the intercepted route where the code is that I actually want to test.

So my handler looks like

        interceptSendToEndpoint("undertow:*").when(method("exTest", "enabled"))
                .throwException(new Exception(("my Exception")))

Can somebody help me out here? I am still on camel 2.25? Is this different between 2.x and 3.x?

Upvotes: 0

Views: 1223

Answers (1)

Pasi Österman
Pasi Österman

Reputation: 2197

If you're talking about unit testing then you should use adviceWith with weaveByToUri or weaveById to replace the http-endpoint with your custom logic that you can then configure to throw the exception.

As far as I understand interceptSendToEndpoint isn't really intended to be used like this in unit testing.

Example:

package com.example;

import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

public class ExampleTest  extends CamelTestSupport {

    @Test
    public void testHttpErrorHandling() throws Exception {

        context.getRouteDefinition("testRoute").adviceWith(context, new AdviceWithRouteBuilder(){

            @Override
            public void configure() throws Exception {

                weaveByToUri("http*")
                    .replace()
                    .throwException(Exception.class, "Test Exception");

                weaveById("logHttpExceptionEndpoint")
                    .after()
                    .to("mock:result");
            } 
        });

        MockEndpoint resultMockEndpoint = getMockEndpoint("mock:result");
        resultMockEndpoint.expectedMessageCount(1);
        resultMockEndpoint.message(0).exchangeProperty("CamelExceptionCaught")
            .isInstanceOf(Exception.class);

        startCamelContext();
        template.sendBody("direct:test", "");


        resultMockEndpoint.assertIsSatisfied();
    }

    @Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        
    
        return new RouteBuilder(){

            @Override
            public void configure() throws Exception {
                
                from("direct:test")
                    .routeId(("testRoute"))
                    .onException(Exception.class)
                        .log("caught exception.").id("logHttpExceptionEndpoint")
                        .handled(true)
                    .end()
                    .to("http:somewebsite.com")
                    .log("Hello from test");
            }
        };
    }

    @Override
    public boolean isUseAdviceWith() {
        return true;
    }
}

As for integration testing you can use a stub or something like mockoon to simulate the web-services to see how they handle different kinds of exceptions outside unit tests.

Upvotes: 1

Related Questions