9

我正在使用 JerseyTest 为 RESTful Web 服务编写一些基于 JUnit 的集成测试。JAX-RS 资源类使用 Spring,我目前正在将所有内容与测试用例连接在一起,如下面的代码示例:

public class HelloResourceTest extends JerseyTest
{
    @Override
    protected AppDescriptor configure()
    {
        return  new WebAppDescriptor.Builder("com.helloworld")
        .contextParam( "contextConfigLocation", "classpath:helloContext.xml")
        .servletClass(SpringServlet.class)
        .contextListenerClass(ContextLoaderListener.class)
        .requestListenerClass(RequestContextListener.class)
        .build();        
    }

    @Test
    public void test()
    {
        // test goes here
    }
}

这适用于连接 servlet,但是,我希望能够在我的测试用例中共享相同的上下文,以便我的测试可以访问模拟对象、DAO 等,这似乎需要 SpringJUnit4ClassRunner。不幸的是,SpringJUnit4ClassRunner 创建了一个单独的并行应用程序上下文。

那么,任何人都知道如何创建一个在 SpringServlet 和我的测试用例之间共享的应用程序上下文?

谢谢!

4

2 回答 2

10

像这样覆盖 JerseyTest.configure:

@Override
protected Application configure() {
  ResourceConfig rc = new JerseyConfig();

  rc.register(SpringLifecycleListener.class);
  rc.register(RequestContextFilter.class);

  rc.property("contextConfigLocation", "classpath:helloContext.xml");
  return rc;
}

对我来说,SpringServlet 不是必需的,但如果您需要,您也可以为此调用 rc.register。

于 2014-07-03T11:24:35.067 回答
5

我找到了几种方法来解决这个问题。

首先,在geek@riffpie博客上,有一个很好的描述这个问题以及一个优雅的扩展JerseyTest来解决它: Unit-testing RESTful Jersey servicesglue together with Spring

不幸的是,我正在使用更新版本的 Spring 和/或 Jersey(忘记哪个)并且不能完全让它工作。

就我而言,我最终通过放弃 Jersey 测试框架并使用嵌入式 Jetty 和 Jersey 客户端来避免这个问题。无论如何,这实际上在我的情况下更有意义,因为我已经在我的应用程序中使用了嵌入式 Jetty。 yves amsellem有一个很好的使用 Jersey 客户端和嵌入式 Jetty 进行单元测试的例子。对于 Spring 集成,我使用了Trimbo 的 Jersey Tests 与 Embedded Jetty 和 Spring的变体

于 2012-05-24T13:31:30.077 回答