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