How to inject ServletContext for JUnit tests with Spring?
I want to unit test a RESTful interface written with Apache CXF.
I use a ServletContext to load some resources, so I have:
@Context
private ServletContext servletContext;
If I deploy this on Glassfish, the ServletContext is injected and it works like expected. But I don't know how to inject the ServletContext in my service class, so that I can test it wi开发者_如何学Cth a JUnit test.
I use Spring 3.0, JUnit 4, CXF 2.2.3 and Maven.
In your unit test, you are probably going to want to create an instance of a MockServletContext.
You can then pass this instance to your service object through a setter method.
As of Spring 4, @WebAppConfiguration annotation on unit test class should be sufficient, see Spring reference documentation
@ContextConfiguration
@WebAppConfiguration
public class WebAppTest {
@Test
public void testMe() {}
}
Probably you want to read resources with servletContext.getResourceAsStream or something like that, for this I've used Mockito like this:
@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;
}
});
}
精彩评论