如何在Spring单元测试中注入ServletContext?

时间:2010-03-24 09:35:19

标签: java unit-testing spring servlets junit

我需要为在Tomcat中运行的相当复杂的应用程序编写一个jUnit测试。

我写了一个构建Spring环境的类。

private static ApplicationContext
springContext = null;

springContext = new ClassPathXmlApplicationContext(
                     new String[] {"beans"....});

在应用程序中有一个电话:

public class myClass implements ServletContextAware { 

.... final String folder = **servletContext.getRealPath**("/example"); ...
}

会破坏所有内容,因为ServletContext为空。

我已经开始构建一个模拟对象:

static ServletConfig servletConfigMock = createMock(ServletConfig.class);
static ServletContext servletContextMock = createMock(ServletContext.class);

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        expect(servletConfigMock.getServletContext())
                 .andReturn(servletContextMock).anyTimes();

        expect(servletContextMock.getRealPath("/example"))
                 .andReturn("...fulllpath").anyTimes();
        replay(servletConfigMock);
        replay(servletContextMock);
    }

是否有一个简单的方法来注入ServletContext或者在jUnit测试的运行时使用部署描述符启动Tomcat?

我正在使用:Spring,Maven,Tomcat 6和EasyMock用于模拟对象。

1 个答案:

答案 0 :(得分:3)

您真正想要的是测试网络层。 有几种方法可以做到:

每当您想在测试中注入某些内容时,请使用ReflectionTestUtils

复杂性来自于Web层不太适合单元测试的事实。它更像是功能测试的主题。

如果有些方法似乎适合单元测试,它们可能属于服务层。他们不应该依赖ServletContext