Как внедрить ServletContext для тестов JUnit с помощью Spring? - PullRequest
17 голосов
/ 20 апреля 2010

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

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

@Context
private ServletContext servletContext;

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

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

Ответы [ 3 ]

21 голосов
/ 20 апреля 2010

В вашем модульном тесте вы, вероятно, захотите создать экземпляр MockServletContext .

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

15 голосов
/ 03 июня 2015

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

@ContextConfiguration
@WebAppConfiguration
public class WebAppTest {
    @Test
    public void testMe() {}
}
1 голос
/ 20 августа 2014

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...