如何在Apache Camel中单元测试一个Servlet端点?

5

我是Camel的新手,现在在我的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());

但是我得到了一个异常,指示我无法创建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.

这是一个新开发的项目,所以我没有太多限制,只需要良好的设计。如果有需要更改路线的建议,我很乐意接受。另外,如果我在做某些事情上不够恰当,请提出改进建议,我很乐意修改问题。


你不能只写一个纯粹的单元测试,你必须要写一个集成测试。 - Woot4Moo
2个回答

7
您需要使用一个http客户端组件将消息发送给Tomcat,例如camel-http组件:http://camel.apache.org/http 您还需要知道Tomcat运行servlet的端口号,例如:
template.send("http://localhost:8080/myapp/myserver", lAuthRequest);

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


谢谢 Claus!有没有推荐的方法来分离路由中的servlet部分,以便我可以对处理器进行单元测试?我应该只是对处理器进行普通的单元测试吗? - Spina
我现在意识到我的问题不够清晰。我试图对我的Web应用程序中的路由逻辑进行单元测试。我意识到(如下所述),我的大部分逻辑不依赖于容器。因此,Claus回答了我问题的另一部分,即如何集成测试已部署的Web应用程序。他描述的技术非常强大。我希望它能得到更多的采用。 - Spina
有没有一种方法可以打印出camel路由可以被触发的完整URL? - javatarz

2

我通过将路由分成两部分来解决了我的问题。现在路由声明如下:

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部分。我认为目前这已经足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接