Jerseyで作成したRESTサービスをJUnitでテストする

Jersey Test Frameworkを使用する

Chapter 7. Jersey Test Framework
いくつか種類があるみたいですが今回使用したのは「jersey-test-framework-grizzly2」
pom.xmlに以下の依存関係を追加します。

<dependency>
  <groupId>com.sun.jersey.jersey-test-framework</groupId>
  <artifactId>jersey-test-framework-grizzly2</artifactId>
  <version>1.14</version>
  <scope>test</scope>
</dependency>

Testクラスを書く

web.xmlでパスを切っていたのですがテストクラスではweb.xmlの指定は必要ないみたいです。
テストクラス作成時のWebResourceのパス指定にて「services/sample/login/id/pw」でなく
sample/login/id/pw」となるので注意

リソースクラスの例

package jp.yustam.jersey.resources;

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

@Path("sample")
public class MyService {

    @GET
    @Path("/login/{id}/{pw}")
    @Produces( { MediaType.TEXT_PLAIN })
    public Response login(@PathParam("id") String id, @PathParam("pw") String pw) {
        return Response.ok().entity("OK").build();
    }

}

web.xmlの例

<servlet>
    <servlet-name>MyRESTService</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
        <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>jp.yustam.jersey.resources</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>MyRESTService</servlet-name>
  <url-pattern>/services/*</url-pattern>
</servlet-mapping>

テストクラスの例

package jp.yustam.jersey.resources;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;

public class MyServiceTest extends JerseyTest {

    public MyServiceTest() {
        super(new WebAppDescriptor.Builder("jp.yustam.jersey.resources").build());
    }

    @Test
    public void testLogin() {
        WebResource wr = resource().path("sample/login/id/pw");
        ClientResponse response = wr.get(ClientResponse.class);
        assertEquals(response.getEntity(String.class), "OK");
    }

}