2014-01-28 8 views
25

Ich bin neu in Unit-Tests und ich möchte einige Jersey-Dienstleistungen in einem Projekt testen. Wir benutzen Junit. Bitte leiten Sie mich dazu, Testfälle besser zu schreiben.Unit Test Jersey Restful Services

Code:

@GET 
    @Path("/getProducts/{companyID}/{companyName}/{date}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Object getProducts(@PathParam("companyID") final int companyID, 
      @PathParam("date") final String date, @PathParam("companyName") final String companyName) 
      throws IOException { 
     return productService.getProducts(companyID, companyName, date); 
    } 

Die oben genannten Service funktioniert gut und ich möchte JUnit-Testfall schreiben oben genannten Verfahren zu testen. Die obige Methode ruft die Produktliste (List<Product>) im JSON-Format ab. Ich möchte einen Testfall schreiben, um den Antwortstatus und das JSON-Format zu überprüfen.

HINWEIS: Wir verwenden Jersey 1.17.1 Version.

Hilfe würde geschätzt :)

Antwort

17

Für Jersey Web-Services-Tests gibt es mehr Test-Frameworks ist, nämlich: Jersey Test Framework (bereits in anderer Antwort erwähnt - siehe hier Dokumentation für Version 1.17 hier: https://jersey.java.net/documentation/1.17/test-framework.html) und REST-Assured (https://code.google.com/p/rest-assured) - siehe hier ein Vergleich/Setup von beiden (http://www.hascode.com/2011/09/rest-assured-vs-jersey-test-framework-testing-your-restful-web-services/).

Ich finde die REST-Assured interessanter und leistungsfähiger, aber Jersey Test Framework ist sehr einfach zu bedienen. In REST-Assured einen Testfall zu schreiben „Antwortstatus und JSON-Format zu überprüfen“ können Sie den folgenden Test schreiben konnte (sehr ähnlich wie Sie in jUnit tun):

package com.example.rest; 

import static com.jayway.restassured.RestAssured.expect; 
import groovyx.net.http.ContentType; 

import org.junit.Before; 
import org.junit.Test; 

import com.jayway.restassured.RestAssured; 

public class Products{ 

    @Before 
    public void setUp(){ 
     RestAssured.basePath = "http://localhost:8080"; 
    } 

    @Test 
    public void testGetProducts(){ 
     expect().statusCode(200).contentType(ContentType.JSON).when() 
       .get("/getProducts/companyid/companyname/12345088723"); 
    } 

} 

Dies sollte den Trick für Sie tun .. Sie können JSON-spezifische Elemente auch sehr einfach und viele andere Details überprüfen. Anweisungen zu weiteren Funktionen finden Sie in der sehr guten Anleitung von REST-Assured (https://code.google.com/p/rest-assured/wiki/Usage). Ein anderes gutes Tutorial ist dieses http://www.hascode.com/2011/10/testing-restful-web-services-made-easy-using-the-rest-assured-framework/.

HTH.

+4

Wie ist es ein Komponententest, wenn Sie auf lokalen Server zeigen? –

+0

Dies ist nur ein Beispiel ... Sie können die Adresse des API-Endpunkts angeben, die Sie benötigen. Diese – emgsilva

+3

ist nicht Unit-Test – MariuszS

6

einfach die Anmerkungen ignorieren und einen normalen Unit-Test schreiben, der die erforderlichen Parameter übergibt. Die Rückkehr, die ich dachte, würde normalerweise vom Typ "javax.ws.rs.core.Response" sein ... Es gibt eine Methode getEntity(), die verwendet werden kann. Ein Mock Object Framework wie Mockito könnte auch in diesem Fall hilfreich sein.

+0

@Neeraj .. Vielen Dank für Ihre Antwort. Könnten Sie bitte Probe teilen, wenn Sie haben? – Unknown

+7

Während Sie mit dieser Methode leicht 100% Abdeckung erhalten, erhalten Sie normalerweise wenig Wissen über Ihre Software. Dies ist ein reiner Komponententest, der seinen Wert hat, aber Sie möchten vielleicht zumindest eine gewisse Integration testen, z. B. URL-Parsing und Daten-Marshalling. –

2

Kennen Sie sich mit Chapter 26. Jersey Test Framework?

public class SimpleTest extends JerseyTest { 

    @Path("hello") 
    public static class HelloResource { 
     @GET 
     public String getHello() { 
      return "Hello World!"; 
     } 
    } 

    @Override 
    protected Application configure() { 
     return new ResourceConfig(HelloResource.class); 
    } 

    @Test 
    public void test() { 
     final String hello = target("hello").request().get(String.class); 
     assertEquals("Hello World!", hello); 
    } 
} 
+2

@Marianzs .. Danke für Ihre Antwort bro. Aber wir verwenden die Version 1.17.1 von Jersey, die Application und ResourceConfig nicht unterstützt. Könnten Sie bitte 1.17.1 Beispiel teilen, wenn Sie haben? – Unknown