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

ファイルアップロードなどMultipartでPOSTするRESTサービスのテストの書き方メモ

リソースクラスの例

package jp.yustam.jersey.resources;

import java.io.InputStream;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
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;

import com.sun.jersey.multipart.FormDataParam;

@Path("file")
public class File{

    @POST
    @Consumes( { MediaType.MULTIPART_FORM_DATA })
    @Produces( { MediaType.TEXT_PLAIN })
    @Path("upload/{fileName}")
    public Response upload(@FormDataParam("file") InputStream stream,
            @PathParam("fileName") String fileName) {
        return Response.ok().entity("OK").build();
    }

}

テストクラスの例

package jp.yustam.jersey.resources;

import static org.junit.Assert.assertEquals;

import java.io.File;
import java.io.IOException;

import javax.ws.rs.core.MediaType;

import org.junit.Test;

import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataBodyPart;
import com.sun.jersey.multipart.FormDataMultiPart;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;

public class FileTest extends JerseyTest {

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

    @Test
    public void testUpload() throws IOException {
        File file = File.createTempFile("TMP", ".tmp");
        FormDataMultiPart form = new FormDataMultiPart();
        form.bodyPart(new FormDataBodyPart(FormDataContentDisposition
                .name("file").build(), file, MediaType.APPLICATION_OCTET_STREAM_TYPE));

        WebResource wr = resource().path("file/upload/fileName");
        ClientResponse response = wr.type(MediaType.MULTIPART_FORM_DATA)
                .post(ClientResponse.class, form);
        assertEquals(response.getEntity(String.class), "OK");

        file.delete();
    }

}