Java Jersey JUnit测试:@WebListener ServletContextListener未调用

Java Jersey JUnit测试:@WebListener ServletContextListener未调用,java,rest,junit,jersey,jax-rs,Java,Rest,Junit,Jersey,Jax Rs,我在Jersey(从中)创建了这个测试,效果很好,但有一个问题:没有调用@WebListener ServletContextListener 我需要测试的资源类依赖于ServletContextListener在ServletContext上设置的属性 我可以确保它被调用,或者我可以用其他方式操纵ServletContext吗 public class SimpleTest extends JerseyTest { @WebListener public static cla

我在Jersey(从中)创建了这个测试,效果很好,但有一个问题:没有调用
@WebListener ServletContextListener

我需要测试的资源类依赖于ServletContextListener在ServletContext上设置的属性

我可以确保它被调用,或者我可以用其他方式操纵ServletContext吗

public class SimpleTest extends JerseyTest {

    @WebListener
    public static class AppContextListener implements ServletContextListener {

        @Override
        public void contextInitialized(ServletContextEvent event) {
            System.out.println("Context initialized");
        }

        @Override
        public void contextDestroyed(ServletContextEvent event) {
            System.out.println("Context destroyed");
        }
    }

    @Path("hello")
    public static class HelloResource {
        @GET
        public String getHello() {
            return "Hello World!";
        }
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(HelloResource.class);
    }

    @Test
    public void test() {
        final String hello = target("hello").request().get(String.class);
        assertEquals("Hello World!", hello);
    }
}
我添加了这些依赖项以实现此功能:

<dependency>
    <groupId>org.glassfish.jersey.test-framework</groupId>
    <artifactId>jersey-test-framework-core</artifactId>
    <version>2.18</version>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>2.18</version>
</dependency>

org.glassfish.jersey.test-framework
jersey测试框架核心
2.18
org.glassfish.jersey.test-framework.providers
jersey-test-framework-provider-grizzly2
2.18

需要将
JerseyTest
设置为在Servlet环境中运行,如下所示。以下是好的方面:

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

@Override
protected DeploymentContext configureDeployment() {
    ResourceConfig config = new ResourceConfig(SessionResource.class);
    return ServletDeploymentContext.forServlet(new ServletContainer(config))
                                   .addListener(AppContextListener.class)
                                   .build();
}
有关详细信息,请参阅API

  • (这是在
    ServletDeploymentContext
    上调用
    forServlet
    时返回的内容)

ServletContextListener
-不是JAX-RS规范的一部分,所以我不认为Jersey会处理它,尤其是
JerseyTest
@DenysDenysiuk是的,它是servlet api。但我如何解决这个问题呢?我正在测试的所有资源类都使用ServletContext来获取我的ServletContextListener中的属性集。另一种操作ServletContext的方法也可以解决我的问题。如果您只需要eventaah,您可以尝试使用而不是
ServletContextListener
,好的,谢谢。实际上,我是朝着正确的方向看的,试图让它覆盖
getTestContainerFactory()
并返回一个
GrizzlyWebTestContainerFactory
,但现在我有了最后一个难题:)我让它工作了。