jersey測試如果依賴外部web容器,測試起來就不方便了;如果用maven管理項目的話,編譯、打包也很不方便。
無意中發現了jersey-test-framework-grizzly2這麽一個測試框架,感覺用起來還可以。根據jersey的使用情況,JerseyTest的應用稍有不同。
都是繼承com.sun.jersey.test.framework.JerseyTest類,復寫setUp()、configure(),setUp啟動內置容器,configure配置資源類包路徑,以及必要的servletClass(默認是com.sun.jersey.spi.container.servlet.ServletContainer)。
測試框架maven依賴
<dependency>
<groupId>com.sun.jersey.jersey-test-framework</groupId>
<artifactId>jersey-test-framework-grizzly2</artifactId>
<version>1.19</version>
<scope>test</scope>
</dependency>
1、單純使用jersey,沒有和其他框架集成,比如spring什麽的。這種情況的測試最為簡單。項目源碼jersey
package com.jersey.demo.resources;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import Java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.ws.rs.core.MediaType;
import org.junit.Before;
import org.junit.Test;
import com.jersey.demo.core.entity.Member;
import com.sun.jersey.api.client.ClientHandlerException;
import com.sun.jersey.api.client.UniforminterfaceException;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.test.framework.AppDescriptor;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;
/**
* 繼承JerseyTest進行測試。
*
* @author sean
*
*/
public class MemberResourceTest extends JerseyTest {
private final String name = "張三";
private WebResource wr;
@Before
public void setUp() throws Exception {
super.setUp();
wr = resource();
}
/**
* 默認servletClass=com.sun.jersey.spi.container.servlet.ServletContainer
*/
@Override
protected AppDescriptor configure() {
return new WebAppDescriptor.Builder("com.jersey.demo.resources")
.contextPath("jerseyDemo").build();
}
@Test
public void testXml() {
Member member = wr.path("member/xml").accept(MediaType.APPLICATION_XML)
.get(Member.class);
// 驗證
assertEquals(name, member.getName());
}
// 其他測試用列
}
以上測試類configure()方法中的Builder的部分源碼如下,可以看出默認servletClass=ServletContainer,和jersey在web.xml中的配置是一致的。
public class WebAppDescriptor extends AppDescriptor {
public static class Builder
extends AppDescriptorBuilder<Builder, WebAppDescriptor> {
protected Map<String, String> initParams;
protected Map<String, String> contextParams;
protected Class<? extends HttpServlet> servletClass = ServletContainer.class;
}
}
2、當jersey和spring集成的時候,需要用到com.sun.jersey.spi.spring.container.servlet.SpringServlet,SpringServlet需要加載spring的配置。如果只是簡單的指定SpringServlet.class,將無法註入spring容器中實例對象。
項目源碼jerseySpring
// 這樣是不行的 FIXME
@Override
protected AppDescriptor configure() {
return new WebAppDescriptor.Builder("com.jersey.demo.resources")
.servletClass(SpringServlet.class).contextPath("jerseyDemo")
.build();
}
所以自定義了一個servlet,復寫了SpringServlet的getDefaultContext()方法,加載spring的配置,這樣就完美的集成了。
package com.jersey.demo.web.servlet;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
public class MyJerseyServlet extends SpringServlet {
private static final long serialVersionUID = 1L;
@Override
protected ConfigurableApplicationContext getDefaultContext() {
return new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
package com.jersey.demo.resources;
/**
* 繼承JerseyTest測試。
*
* @author sean
*
*/
public class MemberResourceTest extends JerseyTest {
private final String name = "張三";
private WebResource wr;
@Before
public void setUp() throws Exception {
super.setUp();
wr = resource();
}
/**
* 加載自定義的MyJerseyServlet,實現與spring容器的集成。
*/
@Override
protected AppDescriptor configure() {
return new WebAppDescriptor.Builder("com.jersey.demo.resources")
.servletClass(MyJerseyServlet.class).contextPath("jerseyDemo")
.build();
}
@Test
public void testXml() {
Member member = wr.path("member/xml").accept(MediaType.APPLICATION_XML)
.get(Member.class);
// 驗證
assertEquals(name, member.getName());
}
// 其他測試用例
}
Tags: jersey import 測試 com gt lt
文章來源: