如何使用Spring为JUnit测试注入ServletContext?

时间:2010-04-20 11:40:03

标签: java spring junit cxf

我想对使用Apache CXF编写的RESTful接口进行单元测试。

我使用ServletContext加载一些资源,所以我有:

@Context
private ServletContext servletContext;

如果我在Glassfish上部署它,则会注入ServletContext,它的工作方式与预期的一样。但我不知道如何在我的服务类中注入ServletContext,以便我可以使用JUnit测试来测试它。

我使用Spring 3.0,JUnit 4,CXF 2.2.3和Maven。

3 个答案:

答案 0 :(得分:21)

在您的单元测试中,您可能想要创建MockServletContext的实例。

然后,您可以通过setter方法将此实例传递给服务对象。

答案 1 :(得分:15)

从Spring 4开始,单元测试类的@WebAppConfiguration注释就足够了,请参阅Spring reference documentation

@ContextConfiguration
@WebAppConfiguration
public class WebAppTest {
    @Test
    public void testMe() {}
}

答案 2 :(得分:1)

可能你想用servletContext.getResourceAsStream或者类似的东西来读取资源,因为我已经像这样使用了Mockito:

 @BeforeClass
void setupContext() {

    ctx = mock(ServletContext.class);
    when(ctx.getResourceAsStream(anyString())).thenAnswer(new Answer<InputStream>() {
        String path = MyTestClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()
                + "../../src/main/webapp";

        @Override
        public InputStream answer(InvocationOnMock invocation) throws Throwable {
            Object[] args = invocation.getArguments();
            String relativePath = (String) args[0];
            InputStream is = new FileInputStream(path + relativePath);
            return is;
        }
    });

}