Meneroka Kerangka Ujian Jersey

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat Jersey Test Framework dan melihat bagaimana kita dapat menggunakannya untuk menulis ujian integrasi dengan cepat.

Seperti yang telah kita lihat dalam artikel sebelumnya, Jersey adalah kerangka sumber terbuka untuk mengembangkan RESTful Web Services . Kami boleh mengetahui lebih lanjut mengenai Jersey dalam pengenalan kami untuk membuat API dengan artikel Jersey dan Spring - di sini.

2. Persediaan Aplikasi

Jersey Test Framework adalah alat untuk membantu kami mengesahkan pelaksanaan komponen pelayan kami yang betul. Seperti yang akan kita lihat nanti, ini menyediakan cara cepat dan bebas untuk menulis ujian integrasi dan dapat menangani komunikasi dengan API HTTP kami dengan baik.

Begitu juga, ia berfungsi hampir di luar kotak dan senang disatukan dengan projek berasaskan Maven kami . Rangka kerja ini berdasarkan pada JUnit walaupun mungkin digunakan dengan TestNG juga yang membuatnya dapat digunakan di hampir semua lingkungan.

Di bahagian seterusnya, kita akan melihat kebergantungan mana yang perlu kita tambahkan ke aplikasi kita untuk menggunakan kerangka kerja.

2.1. Ketergantungan Maven

Pertama sekali, mari tambah pergantungan teras Jersey Test Framework ke pom.xml kami :

 org.glassfish.jersey.test-framework jersey-test-framework-core 2.27 test 

Seperti biasa, kami boleh mendapatkan versi terbaru dari Maven Central.

Hampir semua ujian Jersey menggunakan kilang kontena defacto Grizzly, yang juga perlu kami tambahkan:

 org.glassfish.jersey.test-framework.providers jersey-test-framework-provider-grizzly2 2.27 test 

Sekali lagi kita dapat menemui versi terbaru di Maven Central.

3. Bermula

Pada bahagian seterusnya, kita akan membahas langkah-langkah asas yang diperlukan untuk menulis ujian mudah.

Kami akan memulakan dengan menguji sumber Ucapan selamat di pelayan kami:

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

3.1. Mengkonfigurasi Ujian

Sekarang mari kita tentukan kelas ujian kami:

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

Kita dapat melihat dalam contoh di atas bahawa untuk mengembangkan ujian menggunakan Jersey Test Framework, ujian kita perlu menundukkan JerseyTest .

Seterusnya, kami mengatasi kaedah konfigurasi yang mengembalikan konfigurasi sumber khusus untuk ujian kami dan hanya mengandungi sumber Ucapan . Sudah tentu ini adalah sumber yang ingin kita uji.

3.2. Menulis Ujian Pertama Kami

Mari mulakan dengan menguji permintaan GET sederhana dari API ucapan kami:

@Test public void givenGetHiGreeting_whenCorrectRequest_thenResponseIsOkAndContainsHi() { Response response = target("/greetings/hi").request() .get(); assertEquals("Http Response should be 200: ", Status.OK.getStatusCode(), response.getStatus()); assertEquals("Http Content-Type should be: ", MediaType.TEXT_HTML, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); String content = response.readEntity(String.class); assertEquals("Content of ressponse is: ", "hi", content); } 

Perhatikan bahawa kami mempunyai akses penuh ke respons HTTP - jadi kami dapat melakukan perkara seperti memeriksa kod status untuk memastikan operasi itu benar-benar berjaya, atau bekerja dengan badan respons yang sebenarnya .

Mari kita jelaskan dengan lebih terperinci apa yang kita lakukan dalam contoh di atas:

  1. Hantarkan permintaan HTTP GET ke '/ salam / hi'
  2. Periksa kod status HTTP dan tajuk respons jenis kandungan
  3. Uji isi respons mengandungi rentetan "hi"

4. Menguji GET untuk Mendapatkan Sumber

Sekarang, kita telah melihat langkah-langkah asas yang terlibat dalam membuat ujian. Mari kita uji API Buah sederhana yang kami perkenalkan dalam artikel Jersey MVC Support.

4.1. Dapatkan JSON Plain

Dalam contoh di bawah ini kami bekerjasama dengan badan tindak balas sebagai JSON String standard:

@Test public void givenFruitExists_whenSearching_thenResponseContainsFruit() { final String json = target("fruit/search/strawberry").request() .get(String.class); assertThat(json, containsString("{\"name\":\"strawberry\",\"weight\":20}")); }

4.2. Dapatkan Entiti dan bukannya JSON

Kami juga dapat memetakan respons secara langsung ke kelas entiti Sumber - contohnya:

 @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()); }

Kali ini, kita tentukan jenis Java yang akan ditukar entiti respons dalam kaedah get - objek Buah

5. Menguji POST untuk Membuat Sumber

Untuk membuat Sumber baru di API kami - kami akan memanfaatkan permintaan POST dengan baik. Di bahagian seterusnya, kita akan melihat cara menguji bahagian API ini.

5.1. JSON Pos Plain

Mari mulakan dengan menghantar JSON String biasa untuk menguji penciptaan sumber buah baru:

@Test public void givenCreateFruit_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]")); }

Dalam contoh di atas, kami menggunakan kaedah posting yang menggunakan parameter objek Entity . Kami menggunakan kaedah json yang mudah untuk membuat entiti dari rentetan JSON yang sesuai .

5.2. Post Entity Instead of JSON

As we've already seen with get requests we can also post a Resource entity class directly – for example:

@Test public void givenCreateFruit_whenFruitIsInvalid_thenResponseCodeIsBadRequest() { Fruit fruit = new Fruit("Blueberry", "purple"); fruit.setWeight(1); Response response = target("fruit/create").request(MediaType.APPLICATION_JSON_TYPE) .post(Entity.entity(fruit, 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")); }

This time we use the entity method to post our Fruit entity and also specify the media type as JSON.

5.3. Form Submissions Using POST

In our final post example we will see how to test form submissions via a post request:

@Test public void givenCreateFruit_whenFormContainsNullParam_thenResponseCodeIsBadRequest() { Form form = new Form(); form.param("name", "apple"); form.param("colour", null); Response 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")); }

Similarly, we make use of the Entity class but this time pass a form which contains a number of parameters to our post request.

6. Testing Other HTTP Verbs

Sometimes we need to test other HTTP endpoints such as PUT and DELETE. This is of course perfectly possible using the Jersey Test Framework.

Let's see a simple PUT example:

@Test public void givenUpdateFruit_whenFormContainsBadSerialParam_thenResponseCodeIsBadRequest() { Form form = new Form(); form.param("serial", "2345-2345"); Response response = target("fruit/update").request(MediaType.APPLICATION_FORM_URLENCODED) .put(Entity.form(form)); assertEquals("Http Response should be 400 ", 400, response.getStatus()); assertThat(response.readEntity(String.class), containsString("Fruit serial number is not valid")); }

Once we have called the request method, we can invoke any HTTP method on the current request object.

7. Additional Features

The Jersey test framework contains a number of additional configuration properties which can help aid debugging and testing.

In the next example we'll see how to programmatically enable a feature with a given name:

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

When we create and configure our Jersey application under test. We can also enable additional properties. In this case, we enable two logging properties – LOG_TRAFFIC and DUMP_ENTITYwhich will provide useful additional logging and debug information during test runs.

8. Supported Containers

As we've already mentioned the defacto container used when writing tests with the Jersey Test Framework is Grizzly. However, a number of other containers are supported:

  • In-Memory container
  • HttpServer from Oracle JDK
  • Simple container (org.simpleframework.http
  • Jetty container (org.eclipse.jetty)

For more information on how to configure these containers, please see the documentation here.

9. Conclusion

To summarize, in this tutorial, we’ve explored the Jersey Test Framework. First, we started by introducing how to configure the Jersey Test Framework and then we saw how to write a test for a very simple API.

In the next section, we saw how to write tests for a variety of GET and POST API endpoints. Finally, we looked at some additional features and the containers that the Jersey Test Framework supports.

Seperti biasa, kod sumber penuh artikel terdapat di GitHub.