Как ввести ServletContext в модульный тест Spring? - PullRequest
0 голосов
/ 24 марта 2010

Мне нужно написать тест jUnit для довольно сложного приложения, которое работает в Tomcat.

Я написал класс, который создает мой контекст Spring.

private static ApplicationContext
springContext = null;

springContext = new ClassPathXmlApplicationContext(
                     new String[] {"beans"....});

В приложении есть звонок:

public class myClass implements ServletContextAware { 

.... final String folder = **servletContext.getRealPath**("/example"); ...
}

, который ломает все, потому что ServletContext равен нулю.

Я начал строить фиктивный объект:

static ServletConfig servletConfigMock = createMock(ServletConfig.class);
static ServletContext servletContextMock = createMock(ServletContext.class);

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        expect(servletConfigMock.getServletContext())
                 .andReturn(servletContextMock).anyTimes();

        expect(servletContextMock.getRealPath("/example"))
                 .andReturn("...fulllpath").anyTimes();
        replay(servletConfigMock);
        replay(servletContextMock);
    }

Есть ли простой способ внедрить ServletContext или запустить Tomcat с дескриптором развертывания во время выполнения теста jUnit?

Я использую: Spring, Maven, Tomcat 6 и EasyMock для фиктивных объектов.

1 Ответ

3 голосов
/ 24 марта 2010

Что вы на самом деле хотите - это протестировать веб-слой. Есть несколько способов сделать это:

  • используйте MockServletContext, предоставленные пружиной. Это самый лучший способ - обратитесь к соответствующей документации, чтобы узнать, как это сделать.
  • использовать ServletUnit из HtmlUnit
  • использовать структуру кактуса
  • используйте селен для функциональной проверки веб-слоя
  • сделать макет во время выполнения, как вы сделали

И всякий раз, когда вы хотите ввести что-то в тесте, используйте ReflectionTestUtils

Сложность связана с тем, что веб-слой не совсем подходит для юнит-тестирования. Это больше предмет функционального тестирования.

Если существуют методы, которые кажутся подходящими для модульного тестирования, возможно, они относятся к сервисному уровню. И они не должны зависеть от ServletContext

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