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

Hol*_*osa 9 junit spring unit-testing 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Ben*_*age 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;
}
Run Code Online (Sandbox Code Playgroud)

对我来说,不需要SpringServlet,但如果你需要,你也可以为此调用rc.register.


Hol*_*osa 5

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

首先,在极客@ riffpie博客上有一个关于这个问题的优秀描述以及JerseyTest解决它的优雅扩展: 单元测试RESTful Jersey服务与Spring粘在一起

不幸的是,我正在使用更新版本的Spring和/或Jersey(忘记哪个)并且无法使其正常工作.

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