Java 如何在ApacheCamel中对servlet端点进行单元测试?

Java 如何在ApacheCamel中对servlet端点进行单元测试?,java,unit-testing,tomcat,junit,apache-camel,Java,Unit Testing,Tomcat,Junit,Apache Camel,我刚接触骆驼,现在在我的Tomcat服务器上运行了一个简单的路由。路线是这样建造的: Processor generateWebResponse = new MySpecialProcessor(); from("servlet:///url?matchOnUriPrefix=true").process(generateWebResponse); Exchange lAuthRequest = createExchangeWithBody("[json body!]"); template.

我刚接触骆驼,现在在我的Tomcat服务器上运行了一个简单的路由。路线是这样建造的:

Processor generateWebResponse = new MySpecialProcessor();
from("servlet:///url?matchOnUriPrefix=true").process(generateWebResponse);
Exchange lAuthRequest = createExchangeWithBody("[json body!]");
template.send("servlet:///url", lAuthRequest);
assertEquals("baseline body", lAuthRequest.getOut().getBody());
from("servlet:///auth?matchOnUriPrefix=true").inOut("direct:auth");
from("direct:auth").process(new AuthorizationProcessor());
Exchange lAuthRequest = createExchangeWithBody("test body");
template.send("direct:auth", lAuthRequest);
assertEquals("processed body", lAuthRequest.getOut().getBody());
我尝试了一个简单的单元测试,如下所示:

Processor generateWebResponse = new MySpecialProcessor();
from("servlet:///url?matchOnUriPrefix=true").process(generateWebResponse);
Exchange lAuthRequest = createExchangeWithBody("[json body!]");
template.send("servlet:///url", lAuthRequest);
assertEquals("baseline body", lAuthRequest.getOut().getBody());
from("servlet:///auth?matchOnUriPrefix=true").inOut("direct:auth");
from("direct:auth").process(new AuthorizationProcessor());
Exchange lAuthRequest = createExchangeWithBody("test body");
template.send("direct:auth", lAuthRequest);
assertEquals("processed body", lAuthRequest.getOut().getBody());
但是得到一个异常,表明我无法创建servlet端点。以下是异常消息:

org.apache.camel.FailedToCreateProducerException: Failed to create Producer for endpoint: Endpoint[servlet:///url]. Reason: java.lang.UnsupportedOperationException: You cannot create producer with servlet endpoint, please consider to use http or http4 endpoint.

这是一个新的发展,所以除了良好的设计之外,我没有太多的限制。我愿意接受需要改变路线的建议。另外,如果我在做上面不惯用的事情,我很乐意修改这个问题,并提出改进建议。

您需要使用http客户端组件向Tomcat发送消息,例如camel--http组件:

然后您需要知道Tomcat运行servlet的端口号,例如

template.send("http://localhost:8080/myapp/myserver", lAuthRequest);

您需要将camel-http添加到类路径中,例如,如果您使用maven,则将其作为依赖项添加。

我通过将路由分为两部分来解决我的问题。现在,路由声明如下所示:

Processor generateWebResponse = new MySpecialProcessor();
from("servlet:///url?matchOnUriPrefix=true").process(generateWebResponse);
Exchange lAuthRequest = createExchangeWithBody("[json body!]");
template.send("servlet:///url", lAuthRequest);
assertEquals("baseline body", lAuthRequest.getOut().getBody());
from("servlet:///auth?matchOnUriPrefix=true").inOut("direct:auth");
from("direct:auth").process(new AuthorizationProcessor());
Exchange lAuthRequest = createExchangeWithBody("test body");
template.send("direct:auth", lAuthRequest);
assertEquals("processed body", lAuthRequest.getOut().getBody());
测试结果如下所示:

Processor generateWebResponse = new MySpecialProcessor();
from("servlet:///url?matchOnUriPrefix=true").process(generateWebResponse);
Exchange lAuthRequest = createExchangeWithBody("[json body!]");
template.send("servlet:///url", lAuthRequest);
assertEquals("baseline body", lAuthRequest.getOut().getBody());
from("servlet:///auth?matchOnUriPrefix=true").inOut("direct:auth");
from("direct:auth").process(new AuthorizationProcessor());
Exchange lAuthRequest = createExchangeWithBody("test body");
template.send("direct:auth", lAuthRequest);
assertEquals("processed body", lAuthRequest.getOut().getBody());

这不是一个完整的测试,但允许我覆盖除传入servlet部分之外的所有路由。我认为目前已经足够了。

您不需要编写纯单元测试,您需要编写集成测试。谢谢Claus!有没有推荐的方法来分离路由的servlet部分,以便我可以对处理器进行单元测试?我应该对处理器做一个简单的单元测试吗?我现在意识到我的问题还不清楚。我试图在我的webapp中对路由逻辑进行单元测试。我意识到(正如我在下面记录的)我的大部分逻辑并不依赖于容器。克劳斯回答了我问题的另一部分,那就是如何集成测试一个部署的webapp。他描述的技术非常强大。我希望它能得到更多的采用。有没有一种方法可以打印骆驼路线可以触发的完整URL?