java - 使用 Jersey 测试框架时 Servlet 上下文注入(inject)失败

标签 java testing jersey freemarker servlets

我从 Jersey 开始,并尝试让 freemarker 使用 TDD 来处理它。我想为我的模板创建一个 ViewProcessor,但未能在类中注入(inject) servlet 上下文。

这是类代码:

@Provider
public class myProcessor implements ViewProcessor<Template> {

    [...]
   
    @Context
    public ServletContext myContext;

    [...]

 freemarkerConfiguration.setTemplateLoader(
       new WebappTemplateLoader(myContext,
           myContext.getInitParameter("freemarker.template.path")));

    [...]
    }

这是测试代码:

public class myProcessorTest extends JerseyTest {
   
    public static myProcessor mp;
   
    public myProcessorTest() throws Exception{
        super(new WebAppDescriptor.Builder("com.domain").build());
    }
   
    @Test
    public void firstTest(){
        mp = new myProcessor();
        String path = new String("test.ftl");
        Template template = mp.resolve(path);
        assertNotNull(template);
    }
}

我使用具有如下依赖项的 maven:

<dependency>
    <groupId>com.sun.jersey.jersey-test-framework</groupId>
    <artifactId>jersey-test-framework-grizzly</artifactId>
    <version>1.5-SNAPSHOT</version>
    <scope>test</scope>
</dependency>

当我部署到我的本地 jetty 服务器时,我的代码运行良好。但是如果我想在我的 IDE 中测试代码,它无法注入(inject) servlet 上下文 (@Context) :myContext is null 当我运行测试:/

我想我遗漏了一些东西,但我是 servlet 世界的初学者。

最佳答案

这是一种测试特定资源类的技术,使用 Jersey 测试框架,支持 servlet。还演示了如何自定义 ServletContext

import javax.servlet.ServletContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.test.DeploymentContext;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.ServletDeploymentContext;
import org.glassfish.jersey.test.TestProperties;
import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory;
import org.glassfish.jersey.test.spi.TestContainerException;
import org.glassfish.jersey.test.spi.TestContainerFactory;

import static org.mockito.Mockito.mock;

/**
 * A base class for testing web resources.
 */
public abstract class WebResourceTest extends JerseyTest {

    /**
     * Creates a JAX-RS resource configuration for test purposes.
     */
    @Override
    protected abstract ResourceConfig configure();

    /**
     * Creates a test container factory with servlet support.
     */
    @Override
    protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
        return new GrizzlyWebTestContainerFactory();
    }

    /**
     * Configures a deployment context for JAX-RS.
     */
    @Override
    protected DeploymentContext configureDeployment() {
        ResourceConfig app = configure();
        app.register(new Feature() {
            @Context
            ServletContext servletContext;

            @Override
            public boolean configure(FeatureContext context) {
                servletContext.setAttribute("example", new Object());
                return true;
            }
        });
        return ServletDeploymentContext.forServlet(new ServletContainer(app)).build();
    }
}

用法示例:

import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.core.Context;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.core.Response;
import static org.mockito.Mockito.spy;
import static org.testng.Assert.assertEquals;
import static org.junit.Assert.*;

public class MyResourceTest extends WebResourceTest {

    private MyResource resource;

    @Override
    protected ResourceConfig configure() {
        resource = spy(new MyResource());
        return new ResourceConfig().register(resource);
    }

    @Test
    public void testSomething() {
        Response r = target("/myresource").request().get();
        assertEquals(200, r.getStatus());
        assertEquals(1, resource.count);
    }
}

@Path("/myresource")
public class MyResource {
    int count = 0;

    @Context
    protected ServletContext servletContext;

    @GET
    public void get() {
       Object attr = servletContext.getAttribute("example");
       count++;
    }
}

关于java - 使用 Jersey 测试框架时 Servlet 上下文注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4334870/

相关文章:

java - 使用不提供 WADL 的 REST 服务

dependencies - 缺少 Atmosphere 和 Jersey 的依赖项

java - 我想在我的代码中使用 Jersey 客户端我已经导入了包仍然显示错误

java - 使用 Maven 组装 java 项目

java - 每次服务器关闭时连接都会关闭。已添加超时 10000000。

java - 使用线程搞乱了我的暂停系统

testing - 如何在 Coded UI 中阅读文本?

testing - 用于评估计算机视觉算法的仿真和合成视频生成

testing - 如何以合理的方式验证大量事件

java - 从 JSON 数据中删除高级字段