package camelinaction;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.camel.util.ObjectHelper;
import org.junit.Test;
/**
* Unit test to simulate a real component by mocking a TCP server called miranda.
* <p/>
* Instead using mock we can return a canned reply acting as if we was communicating
* with the real component.
*/
public class MirandaTest extends CamelTestSupport {
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("jetty://http://localhost:9080/service/order")
.process(new OrderQueryProcessor())
.to("mock:miranda")
.process(new OrderResponseProcessor());
}
};
}
@Test
public void testMiranda() throws Exception {
context.setTracing(true);
MockEndpoint mock = getMockEndpoint("mock:miranda");
mock.expectedBodiesReceived("ID=123");
mock.whenAnyExchangeReceived(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody("ID=123,STATUS=IN PROGRESS");
}
});
String out = template.requestBody("http://localhost:9080/service/order?id=123", null, String.class);
assertEquals("IN PROGRESS", out);
assertMockEndpointsSatisfied();
}
private class OrderQueryProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
String id = exchange.getIn().getHeader("id", String.class);
exchange.getIn().setBody("ID=" + id);
}
}
private class OrderResponseProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
String reply = ObjectHelper.after(body, "STATUS=");
exchange.getIn().setBody(reply);
}
}
}