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