Jersey 如何在测试类开始时启动GrizzlyWebContainer,并在测试类执行后关闭

Jersey 如何在测试类开始时启动GrizzlyWebContainer,并在测试类执行后关闭,jersey,Jersey,我正在使用JerseyTest测试RESTful Web服务。我观察到的一件事是grizzly是每个方法的启动/停止,运行测试需要很长时间。是否有办法在整个测试类中启动/停止灰熊一次 public class JerseyTestBase extends JerseyTest { @Override protected TestContainerFactory getTestContainerFactory() throws TestContainerException {

我正在使用JerseyTest测试RESTful Web服务。我观察到的一件事是grizzly是每个方法的启动/停止,运行测试需要很长时间。是否有办法在整个测试类中启动/停止灰熊一次

public class JerseyTestBase extends JerseyTest {

@Override
protected TestContainerFactory getTestContainerFactory()
        throws TestContainerException {
    return new GrizzlyWebTestContainerFactory();
}

public JerseyTestBase() {

    super(new WebAppDescriptor.Builder("xxx.xxx.controller") 
    .contextPath("test") 
    .contextParam("contextConfigLocation", "classpath:spring/application-context.xml")             
    .contextListenerClass(ContextLoaderListener.class)
    .requestListenerClass(RequestContextListener.class)
    .servletPath("/*")
    .servletClass(SpringServlet.class)
    .initParam("JSONConfiguration.Builder.rootUnwrapping", "true")
    .initParam("com.sun.jersey.api.json.POJOMappingFeature", "false")
    .initParam("com.sun.jersey.config.property.MediaTypeMappings", "json :  pplication/json")
    .initParam("com.sun.jersey.spi.container.ContainerRequestFilters", "com.sun.jersey.api.container.filter.LoggingFilter")
    .initParam("com.sun.jersey.spi.container.ContainerResponseFilters", "com.sun.jersey.api.container.filter.LoggingFilter")
    .build());
}
}

实际测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring/application-context.xml"/*,     "classpath:applicationContext-unittest.xml"*/})
public class PurchaseManagerClientControllerTestCase extends JerseyTestBase {}

提前感谢

我认为目前不可能直接使用
JerseyTest
,但是您可以基于
JerseyTest
创建自己的定制父测试类,并使用
@BeforeClass
@AfterClass
注释(来自
org.junit
软件包)而不是在之前和之后

由这些方法注释的方法必须是
静态的
,因此您需要更多地重写原始类,但是如果您不需要
JerseyTest
在使用多个
TestContainer
实现方面的多功能性,您可以创建自己的测试基类的更简单版本。 基本上只需使用
JerseyTest
构造函数中的一些代码来初始化Jersey应用程序,使用
GrizzlyTestContainerFactory.GrizzlyTestContainer
类中的一些代码来启动/停止服务器,等等


希望这能有所帮助。

我知道这个问题已经很老了,但下面是答案(我也有同样的需要)

此解决方案是在与Jersey维护人员讨论后提出的:

package org.opensilex.integration.test;
导入java.net.URI;
导入javax.servlet.http.HttpServletRequest;
导入javax.ws.rs.client.client;
导入org.glassfish.jersey.internal.inject.AbstractBinder;
导入org.glassfish.jersey.server.ResourceConfig;
导入org.glassfish.jersey.test.DeploymentContext;
导入org.glassfish.jersey.test.JerseyTest;
导入静态org.glassfish.jersey.test.JerseyTest.closeIfNotNull;
导入org.glassfish.jersey.test.TestProperties;
导入org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory;
导入org.glassfish.jersey.test.spi.TestContainer;
导入org.glassfish.jersey.test.spi.TestContainerException;
导入org.glassfish.jersey.test.spi.TestContainerFactory;
导入org.junit.After;
导入org.junit.AfterClass;
导入org.junit.Before;
导入org.mockito.mockito;
公共抽象类SingleServerStartStopForTestClass扩展了JerseyTest{
私有静态TestContainerFactory TestContainerFactory;
私有静态TestContainer globalTestContainer=null;
私有静态客户端globalClient=null;
@下课
public static void stopGlobalContainer()引发异常{
试一试{
if(globalTestContainer!=null){
globalTestContainer.stop();
}
}最后{
closeIfNotNull(全局客户端);
}
globalTestContainer=null;
globalClient=null;
}
@以前
public void setUp()引发异常{
super.setUp();
if(globalClient==null){
globalClient=this.getClient();
}
}
@凌驾
受保护的客户端getClient(){
if(globalClient==null){
返回super.getClient();
}否则{
返回globalClient;
}
}
@凌驾
受保护的TestContainerFactory getTestContainerFactory()引发TestContainerException{
如果(testContainerFactory==null){
testContainerFactory=新的CustomTestContainerFactory();
}
返回testContainerFactory;
}
私有类CustomTestContainerFactory扩展了GrizzlyTestContainerFactory{
@凌驾
公共TestContainer创建(URI baseUri,DeploymentContext上下文){
if(globalTestContainer==null){
globalTestContainer=super.create(baseUri,上下文);
}
返回globalTestContainer;
}
}
@之后
@凌驾
public void tearDown()引发异常{
//覆盖以避免
}
@凌驾
受保护的ResourceConfig配置(){
启用(TestProperties.LOG\u流量);
启用(TestProperties.DUMP_实体);
资源配置资源配置;
试一试{
//初始化应用程序
resourceConfig=新的resourceConfig();
//为HttpServletRequest创建一个模拟,grizzly不提供该模拟
最终HttpServletRequest请求=Mockito.mock(HttpServletRequest.class);
register(新的AbstractBinder(){
@凌驾
受保护的void configure(){
绑定(request).to(HttpServletRequest.class);
}
});
}捕获(例外e){
抛出新的运行时异常(e);
}
返回resourceConfig;
}
}