访问JerseyTest中的Spring bean

时间:2011-01-12 06:57:19

标签: unit-testing spring testing integration-testing jersey

我正在试图弄清楚如何从JerseyTest的子类访问Spring bean。 扩展JerseyTest我已经设法在我的测试中加载Spring上下文,但我还没弄清楚如何访问spring上下文。我的设置如下:

public abstract class SpringJerseyTest extends JerseyTest {
    public SpringJerseyTest() throws Exception {
        super(new WebAppDescriptor.Builder("com.acme.resources")
            .contextPath("/")
            .contextParam("contextConfigLocation", "classpath:applicationContext.xml")
            .servletClass(SpringServlet.class)
            .contextListenerClass(ContextLoaderListener.class)
            .build());
    }

}

设置使用默认的Grizzly Web容器。我之前从未使用Grizzly,但在Jetty中我会做这样的事情:

    public Object getSpringBean(String beanName) {
        WebAppContext context = (WebAppContext) server.getHandler();
        ServletContext sc = context.getServletContext();
        WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(sc);
        return applicationContext.getBean(beanName);
    }

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:10)

我正在使用一种天真的方法,但工作

public ResourceIT()
    {
        super(new WebAppDescriptor.Builder("amazingpackage")
                .servletClass(SpringServlet.class)
                .contextParam("contextConfigLocation", "classpath:/spring/context.xml")
                .contextListenerClass(ContextLoaderListener.class)
                .contextPath("context")
                .build());
        injectedBean = ContextLoaderListener
                .getCurrentWebApplicationContext().getBean(InjectedBean.class);
    }

答案 1 :(得分:2)

使用了here描述的解决方案一周,它运行正常。

答案 2 :(得分:-1)

我不理解使用Spring bean的JerseyTest的需要,通常你的Spring Beans是Service / Dao层,他们必须在他们的层上进行单元测试/集成测试,使用Mockito或DBUnit(集成测试)。

我一直在使用Sprig bean作为模拟单元测试Jersey资源类,这是因为你必须隔离测试,并且只测试JerseyTest中的Jersey东西(和Json),而不是Service或Dao Layer。是的,我确实通过了我的春豆背景,但春豆只是嘲笑,因为我不想测试JerseyTests中的春豆。

如果您将测试隔离开来,那么编写和维护测试会更容易