使用Spring和Jersey测试框架进行单元测试

时间:2012-05-15 19:03:04

标签: spring unit-testing junit jersey

我正在使用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和我的测试用例之间共享的应用程序上下文?

谢谢!

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:5)

我找到了几种解决此问题的方法。

首先,在 geek @ riffpie 博客上,有一个关于此问题的优秀描述以及JerseyTest的优雅扩展来解决它: Unit-testing RESTful Jersey services glued together with Spring

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

在我的情况下,我最终通过放弃Jersey测试框架并使用嵌入式Jetty和Jersey客户端来避免这个问题。这实际上在我的情况下更有意义,因为我已经在我的应用程序中使用嵌入式Jetty。 yves amsellem 有一个很好的unit testing with the Jersey Client and embedded Jetty示例。对于Spring集成,我使用了 Trimbo的 Jersey Tests with Embedded Jetty and Spring

的变体