对JAX-RS Web服务进行单元测试?
我目前正在寻找为基于JAX-RS(用于RESTful Web服务的Java API)的Web服务创建自动化测试的方法。
我基本上需要一种发送某些输入并验证我是否获得了预期响应的方法。我更愿意通过JUnit做到这一点,但是我不确定如何实现。
我们使用什么方法来测试Web服务?
更新:正如entzik所指出的那样,将Web服务与业务逻辑分离可以让我对业务逻辑进行单元测试。但是,我也想测试正确的HTTP状态代码等。
解决方案
我们可能编写了一些实现业务逻辑的Java代码,然后为它生成了Web服务端点。
重要的事情是独立测试业务逻辑。由于它是纯Java代码,因此我们可以使用常规的JUnit测试来做到这一点。
现在,由于Web服务部分只是一个终点,因此我们需要确保生成的管道(桩等)与Java代码同步。我们可以通过编写用于调用生成的Web服务Java客户端的JUnit测试来做到这一点。当我们更改Java签名而不更新Web服务内容时,这将使我们知道。
如果Web服务管道是由构建系统在每次构建时自动生成的,则可能不必测试端点(假设它们均已正确生成)。取决于偏执程度。
我使用Apache的HTTPClient(http://hc.apache.org/)调用Restful Services。 HTTP客户端库使我们可以轻松地执行获取,发布或者所需的其他任何操作。如果服务使用JAXB进行xml绑定,则可以创建JAXBContext来序列化和反序列化HTTP请求的输入和输出。
Jersey附带了一个很棒的RESTful客户端API,这使得编写单元测试非常容易。请参阅Jersey附带的示例中的单元测试。如果我们对测试用例感兴趣,我们将使用这种方法来测试Apache Camel中的REST支持。
尽管从发布问题的日期算起为时已晚,但认为这可能对有类似问题的其他人很有用。
Jersey带有一个称为Jersey测试框架的测试框架,该框架允许我们测试RESTful Web服务,包括响应状态代码。我们可以使用它在Grizzly,HTTPServer和/或者EmbeddedGlassFish等轻量级容器上运行测试。同样,该框架可用于在常规Web容器(例如GlassFish或者Tomcat)上运行测试。
An important thing to do is to independently test your business logic
我当然不会认为,出于某种奇怪的,莫名其妙的原因,编写JAX-RS代码并希望对接口进行单元测试的人完全没有想到可以对程序的其他部分进行单元测试,包括业务逻辑类。陈述明显的观点几乎没有帮助,并且反复指出要对响应进行测试也很重要。
Jersey和RESTEasy都具有客户端应用程序,并且在RESTEasy的情况下,我们可以使用相同的注释(甚至将带注释的接口排除在外,并在测试的客户端和服务器端使用)。
REST并非此服务可以为我们提供的服务; REST我们可以为此服务执行的操作。
我们可以尝试REST保证,这使测试REST服务和验证Java中的响应(使用JUnit或者TestNG)变得非常简单。