package org.talend.test;
import java.util.Map;
import org.apache.camel.CamelContext;
import org.apache.camel.EndpointInject;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
import esbdemos.simpleroute_0_1.SimpleRoute;
public class RouteTestSample extends CamelTestSupport {
@EndpointInject(uri = "mock:result")
protected MockEndpoint resultEndpoint;
@Produce(uri = "direct:start")
protected ProducerTemplate template;
private RouteBuilder builder;
@Test
public void testSendMatchingMessage() throws Exception {
String expectedBody = "bar";
resultEndpoint.expectedBodiesReceived(expectedBody);
template.sendBody(expectedBody);
resultEndpoint.assertIsSatisfied();
}
@Test
public void testSendNotMatchingMessage() throws Exception {
resultEndpoint.expectedMessageCount(0);
template.sendBody("foo");
resultEndpoint.assertIsSatisfied();
}
@Override
protected CamelContext createCamelContext() throws Exception {
SimpleRoute route = new SimpleRoute();
// Setup the test aliases
Map<String, String> uriProperties = route.getUriMap();
uriProperties.put("start", "direct:start");
uriProperties.put("end", "mock:result");
route.loadCustomUriMap(uriProperties);
// Build the route
builder = route.Route(false);
return builder.getContext();
}
@Override
protected RouteBuilder createRouteBuilder() {
return builder;
}
}
As is shown above, we are going to use the Camel Test framework to test the
Route, which requires to use special mockendpoints to extract results
during the unit testing. But the Route we have created does not use such
mock endpoints. It uses the usual file and log
components. As a solution for that, we will replace the file and
log components with the direct:start and
mock:result components. In lines 49 to 52, you can see a
Map<String,String> which maps the component name
to it's URI, and replaces values for start and end. By doing
so we are able to mock the components to test the Route in isolation.