1.概述

在本教程中,我们将看一看Jersey测试框架,并看看我们如何使用它来快速编写集成测试。

正如我们在之前的文章中看到的,泽西岛是一个用于开发RESTful Web服务的开源框架吗.我们可以在介绍如何用Jersey和S金宝搏官网188bepring创建API的文章中了解更多关于Jersey的信息在这里

2.应用程序设置

Jersey Test Framework是一个帮助我们验证服务器端组件正确实现的工具。我们稍后会看到,它为编写集成测试提供了一种快速而简单的方法能够很好地处理与HTTP api的通信。

同样,它几乎是开箱即用的,很容易与基于maven的项目集成.该框架主要基于JUnit,尽管它也可以与TestNG一起使用,这使得它可以在几乎所有环境中使用。

在下一节中,我们将看到需要向应用程序添加哪些依赖项才能使用框架。

2.1.Maven的依赖关系

首先,让我们将Jersey Test Framework核心依赖项添加到我们的pom.xml

<依赖> < groupId > org.glassfish.jersey。test-framework jersey-test-framework-core 2.27 test 

和往常一样,我们可以从Maven中央

几乎所有Jersey测试都使用实际的Grizzly测试容器工厂,我们还需要添加:

<依赖> < groupId > org.glassfish.jersey.test-framework。providers jersey-test-framework-provider-grizzly2 2.27 test 

我们可以再次找到最新的版本Maven中央

3.开始

在下一节中,我们将介绍编写一个简单测试所需的基本步骤。

我们将从简单的开始测试问候我们服务器上的资源:

@Path("/hi") public class greetings {@GET @Path("/hi") public String gethigreting () {return "hi";} }

3.1.配置测试

现在让我们定义我们的测试类:

public class GreetingsResourceIntegrationTest extends JerseyTest {@Override protected Application configure() {return new ResourceConfig(greeting .class);} / /……}

我们可以在上面的例子中看到,要使用Jersey test Framework开发一个测试,我们的测试需要子类化JerseyTest

接下来,我们重写配置方法,该方法为我们的测试返回自定义资源配置,并仅包含问候资源。当然,这是我们希望测试的资源。

3.2.编写我们的第一个测试

让我们从测试问候API的一个简单GET请求开始:

@Test public void gireventhigreeting_whencorrectrequest_thenresponseisokandcontainshi () {Response Response = target("/greetings/hi").request() .get();assertEquals("Http Response should be 200: ", Status.OK.getStatusCode(), Response . getstatus ());assertEquals(“Http内容类型应该是:”,MediaType。TEXT_HTML response.getHeaderString (HttpHeaders.CONTENT_TYPE));String content = response.readEntity(String.class);assertEquals(“响应的内容是:”,“hi”,内容);}

注意,我们可以完全访问HTTP响应-因此,我们可以做一些事情,如检查状态代码以确保操作实际上是成功的,或与响应的实际主体一起工作

让我们更详细地解释一下在上面的例子中我们做了什么:

  1. 发送一个HTTP GET请求到' /greetings/hi'
  2. 检查HTTP状态代码和内容类型响应头
  3. 测试响应的内容是否包含字符串“hi”

4.测试GET以检索资源

现在,我们已经看到了创建测试所涉及的基本步骤。让我们来测试一下我们在excellent中引入的简单Fruit APIJersey MVC支持文章

4.1.得到纯JSON

在下面的例子中,我们将响应体作为标准JSON字符串:

@Test public void givenFruitExists_whenSearching_thenResponseContainsFruit() {final String json = target("fruit/search/strawberry").request() .get(String.class);为了(json, containsString(“{\“\”:\“草莓\”,\“体重\”:20}"));}

4.2.获取实体而不是JSON

我们还可以将响应直接映射到Resource实体类,例如:

@Test public void givenFruitExists_whenSearching_thenResponseContainsFruitEntity() {final Fruit entity = target(" Fruit /search/strawberry").request() .get(Fruit.class);assertEquals("Fruit name: ", "strawberry", entity.getName());assertEquals("Fruit weight: ", Integer.valueOf(20), entity.getWeight());}

这一次,我们指定响应实体将转换为的Java类型得到方法- - - - - -水果对象。

5.测试POST创建资源

为了在我们的API中创建一个新的资源,我们将充分利用POST请求。在下一节中,我们将看到如何测试API的这一部分。

5.1.帖子平原JSON

让我们从发布一个简单的JSON字符串开始,以测试新水果资源的创建:

@Test public void givencreatfruit_whenjsoniscorrect_thenresponsecodeiscreated () {Response Response = target("fruit/created").request() .post(Entity.json("{\"name\":\"strawberry\",\"weight\":20}");assertEquals("Http Response should be 201 ", Status.CREATED.getStatusCode(), Response . getstatus ());assertThat(response.readEntity(String.class), containsString("Fruit saved: Fruit [name: strawberry colour: null]");}

在上面的例子中,我们使用帖子方法,该方法接受实体对象参数。我们使用方便json方法从对应的JSON字符串创建实体

5.2。Post Entity代替JSON

正如我们已经在get请求中看到的,我们还可以直接发布Resource实体类——例如:

@Test public void givencreatfruit_whenfruitisinvalid_thenresponsecodeisbadrequest(){水果水果= new Fruit("蓝莓","紫色");fruit.setWeight (1);响应响应= target("fruit/create").request(MediaType.APPLICATION_JSON_TYPE) .post(Entity. post .post .post .post .post .post .post .post .post。实体(水果、MediaType.APPLICATION_JSON_TYPE));assertEquals("Http Response should be 400 ", 400, Response . getstatus ());assertThat(response.readEntity(String.class), containsString("Fruit weight must be 10 or greater"));}

这次我们用实体方法来发布我们的Fruit实体,并将媒体类型指定为JSON。

5.3。使用POST提交表单

在最后一个post示例中,我们将看到如何通过post请求测试表单提交:

@Test public void givenCreateFruit_whenFormContainsNullParam_thenResponseCodeIsBadRequest() {Form Form = new Form();的形式。参数(“名字”,“苹果”);的形式。参数(“颜色”,零);Response = target("fruit/create").request(MediaType.APPLICATION_FORM_URLENCODED) .post(Entity.form(form));assertEquals("Http Response should be 400 ", 400, Response . getstatus ());assertThat(response.readEntity(String.class), containsString("Fruit colour must not be null"));}

同样地,我们利用实体类,但这一次传递一个包含许多参数的表单到post请求。

6.测试其他HTTP动词

有时我们需要测试其他HTTP端点,如PUT和DELETE。当然,这是完全可能的使用Jersey测试框架。

让我们看一个简单的PUT例子:

@Test public void givenUpdateFruit_whenFormContainsBadSerialParam_thenResponseCodeIsBadRequest() {Form Form = new Form();的形式。参数(“系列”,“2345 - 2345”);Response = target("fruit/update").request(mediattype . application_form_urlencoded) .put(Entity.form(form));assertEquals("Http Response should be 400 ", 400, Response . getstatus ());assertThat(response.readEntity(String.class), containsString("水果序列号无效"));}

一旦我们调用了请求方法,则可以调用当前请求对象上的任何HTTP方法。

7.附加功能

Jersey测试框架包含许多额外的配置属性,可以帮助调试和测试。

在下一个例子中,我们将看到如何通过编程方式启用一个指定名称的特性:

public class FruitResourceIntegrationTest extends JerseyTest {@Override protected Application configure() {enable(TestProperties.LOG_TRAFFIC);使(TestProperties.DUMP_ENTITY);/ /……

当我们创建和配置测试中的Jersey应用程序时。我们还可以启用其他属性。在本例中,我们启用两个日志属性-LOG_TRAFFICDUMP_ENTITY它将在测试运行期间提供有用的附加日志和调试信息。

8.支持容器

正如我们已经提到的,使用Jersey测试框架编写测试时使用的实际容器是Grizzly。但是,也支持其他一些容器:

  • 内存容器
  • 来自Oracle JDK的HttpServer
  • 简单的容器(org.simpleframework.http
  • Jetty容器(org.eclipse.jetty)

有关如何配置这些容器的更多信息,请参阅文档在这里

9.结论

总结一下,在本教程中,我们探索了Jersey测试框架。首先,我们介绍了如何配置Jersey Test Framework,然后我们看到了如何为一个非常简单的API编写测试。

在下一节中,我们将看到如何为各种GET和POST API端点编写测试。最后,我们看了Jersey Test Framework支持的一些附加特性和容器。

与往常一样,本文的完整源代码是可用的在GitHub

通用的底部

从Spring 5和Spring Boot 2开始学习的春天课程:

>>看看课程
这篇文章的评论已经关闭!