单元测试JAX-RS Web服务?

Ein*_*nar 78 java junit unit-testing web-services jax-rs

我目前正在寻找为基于Web服务的JAX-RS(基于REST的Web服务的Java API)创建自动化测试的方法.

我基本上需要一种方法来发送它某些输入并验证我得到了预期的响应.我宁愿通过JUnit这样做,但我不确定如何实现.

您使用什么方法来测试您的Web服务?

更新:正如entzik指出的那样,将Web服务与业务逻辑分离后,我可以对业务逻辑进行单元测试.但是,我还想测试正确的HTTP状态代码等.

Jam*_*han 35

Jersey提供了一个出色的RESTful客户端API,使编写单元测试变得非常简单.请参阅Jersey附带的示例中的单元测试.如果您对测试用例感兴趣,我们使用此方法测试Apache Camel中的REST支持

  • re:现在链接不好你可以找到显示单元测试的球衣/样本中提到的例子,基本上是通过使用球衣的消费者来消耗网络资源.http://download.java.net/maven/2/com/sun/jersey/samples/bookstore/1.1.5-ea-SNAPSHOT (6认同)
  • 糟糕的链接再次 - 记得更新? (6认同)
  • 这个项目在GitHub上,在src/test文件夹中找到测试:https://github.com/jersey/jersey/tree/master/examples/bookstore-webapp (2认同)
  • 我对此表示怀疑,但我感到非常有趣的是,Jersey总是进入JAX-RS对话,在某些情况下(不幸的是,准确地说,WebSphere)它不可用,并且提供了所有可接受答案的99%在Stack Overflow上无效。 (2认同)

Joh*_*han 24

您可以尝试使用REST Assured,这样可以非常简单地测试REST服务并验证Java中的响应(使用JUnit或TestNG).


Fır*_*ÇÜK 13

正如詹姆斯所说; Jersey 有内置的测试框架.一个简单的hello world示例可以是这样的:

用于maven集成的pom.xml.当你跑步mvn test.框架开始一个灰熊容器.您可以通过更改依赖项来使用jetty或tomcat.

...
<dependencies>
  <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.16</version>
  </dependency>

  <dependency>
    <groupId>org.glassfish.jersey.test-framework</groupId>
    <artifactId>jersey-test-framework-core</artifactId>
    <version>2.16</version>
    <scope>test</scope>
  </dependency>

  <dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>2.16</version>
    <scope>test</scope>
  </dependency>
</dependencies>
...
Run Code Online (Sandbox Code Playgroud)

ExampleApp.java

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/")
public class ExampleApp extends Application {

}
Run Code Online (Sandbox Code Playgroud)

HelloWorld.java

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/")
public final class HelloWorld {

    @GET
    @Path("/hello")
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHelloWorld() {

        return "Hello World!";
    }
}
Run Code Online (Sandbox Code Playgroud)

HelloWorldTest.java

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;
import javax.ws.rs.core.Application;
import static org.junit.Assert.assertEquals;

public class HelloWorldTest extends JerseyTest {

    @Test
    public void testSayHello() {

        final String hello = target("hello").request().get(String.class);

        assertEquals("Hello World!", hello);
    }

    @Override
    protected Application configure() {

        return new ResourceConfig(HelloWorld.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以查看示例应用程序.


ent*_*zik 6

您可能编写了一些实现业务逻辑的Java代码,然后为它生成了Web服务端点.

一件重要的事情是独立测试您的业务逻辑.由于它是纯Java代码,因此您可以使用常规JUnit测试来实现.

现在,由于Web服务部分只是一个终点,您要确保生成的管道(存根等)与您的Java代码同步.您可以通过编写调用生成的Web服务Java客户端的JUnit测试来实现.这将告诉您何时更改Java签名而不更新Web服务的内容.

如果您的构建系统在每次构建时自动生成Web服务管道,则可能没有必要测试端点(假设它们都已正确生成).取决于你的偏执程度.

  • 您说的很对,尽管我还需要测试返回的实际 HTTP 响应,尤其是 HTTP 状态代码。 (2认同)

小智 6

虽然从发布问题之日起为时已晚,但认为这可能对其他有类似问题的人有用.Jersey带有一个名为Jersey Test Framework测试框架,允许您测试RESTful Web服务,包括响应状态代码.您可以使用它在轻量级容器(如Grizzly,HTTPServer和/或EmbeddedGlassFish)上运行测试.此外,该框架可用于在常规Web容器(如GlassFish或Tomcat)上运行测试.