JerseyTest

分類:IT技術 時間:2017-07-05

   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

文章來源:


ads
ads

相關文章
ads

相關文章

ad