Ответ 1
В вашем unit test вам, вероятно, захочется создать экземпляр MockServletContext.
Затем вы можете передать этот экземпляр вашему объекту службы через метод setter.
Я хочу unit test интерфейс RESTful, написанный с Apache CXF.
Я использую ServletContext для загрузки некоторых ресурсов, поэтому у меня есть:
@Context
private ServletContext servletContext;
Если я разворачиваю это на Glassfish, ServletContext вводится и работает, как и ожидалось. Но я не знаю, как вводить ServletContext в свой класс сервиса, чтобы я мог протестировать его с помощью теста JUnit.
Я использую Spring 3.0, JUnit 4, CXF 2.2.3 и Maven.
В вашем unit test вам, вероятно, захочется создать экземпляр MockServletContext.
Затем вы можете передать этот экземпляр вашему объекту службы через метод setter.
Как и в случае с Spring 4, аннотация @WebAppConfiguration в классе unit test должна быть достаточной, см. Spring справочная документация
@ContextConfiguration
@WebAppConfiguration
public class WebAppTest {
@Test
public void testMe() {}
}
Возможно, вы хотите читать ресурсы с помощью 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;
}
});
}