在单元测试中,我想模拟Exception发生的情况。
由于doTry/doCatch-block ,我希望在“mock:count”端点收到一条消息。为什么这没有发生,为什么Exception由一般onException-block处理?
import org.apache.camel.LoggingLevel;
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.apache.cxf.binding.soap.SoapFault;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
public class TestClass extends CamelTestSupport {
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
onException(Exception.class)
.log(LoggingLevel.INFO, "outer catch")
.handled(true);
from("direct:start")
.doTry()
.to("mock:exception")
.doCatch(Exception.class)
.log(LoggingLevel.INFO, "inner catch")
.to("mock:count")
.end();
}
};
}
@Test
public void testBlaat() throws Exception {
final SoapFault soapFault = new SoapFault("Something clearly went wrong", SoapFault.FAULT_CODE_CLIENT);
Element detail = soapFault.getOrCreateDetail();
Document doc = detail.getOwnerDocument();
Text tn = doc.createTextNode("Fault details");
detail.appendChild(tn);
context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
interceptSendToEndpoint("mock:exception").throwException(new Exception("test"));
}
});
template.sendBody("direct:start", "start");
MockEndpoint endpoint = getMockEndpoint("mock:count");
endpoint.expectedMessageCount(1);
assertMockEndpointsSatisfied();
}
}
Run Code Online (Sandbox Code Playgroud)
事实证明,当路由被 截获时AdviceWithRouteBuilder,从RouteDefinition's不会看到从 an 抛出的异常,因为它们在不同的通道上。解决这个问题的方法是对端点使用模拟并从模拟中抛出异常:doTry/doCatchAdviceWithRouteBuilder
getMockEndpoint("mock:exception").whenAnyExchangeReceived(new
Processor() {
@Override
public void process(Exchange exchange) throws Exception {
throw new Exception("fail me");
}
});
Run Code Online (Sandbox Code Playgroud)
见:http : //camel.465427.n5.nabble.com/question-about-exception-handling-behavior-td5743489.html
另请参阅 JIRA 上的此问题:https : //issues.apache.org/jira/browse/CAMEL-6300 它已在 Camel 2.10.5 和其他较新版本中修复。