Как установить ServletContext для тестов JUnit с помощью Spring?

Я хочу unit test интерфейс RESTful, написанный с Apache CXF.

Я использую ServletContext для загрузки некоторых ресурсов, поэтому у меня есть:

@Context
private ServletContext servletContext;

Если я разворачиваю это на Glassfish, ServletContext вводится и работает, как и ожидалось. Но я не знаю, как вводить ServletContext в свой класс сервиса, чтобы я мог протестировать его с помощью теста JUnit.

Я использую Spring 3.0, JUnit 4, CXF 2.2.3 и Maven.

Ответы

Ответ 1

В вашем unit test вам, вероятно, захочется создать экземпляр MockServletContext.

Затем вы можете передать этот экземпляр вашему объекту службы через метод setter.

Ответ 2

Как и в случае с Spring 4, аннотация @WebAppConfiguration в классе unit test должна быть достаточной, см. Spring справочная документация

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

Ответ 3

Возможно, вы хотите читать ресурсы с помощью 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;
        }
    });

}