Создание ложного запроса HttpServletRequest из строки URL? - PullRequest
59 голосов
/ 23 июня 2011

У меня есть служба, которая выполняет некоторую работу над объектом HttpServletRequest, в частности, используя request.getParameterMap и request.getParameter для создания объекта.

Мне было интересно, есть ли простой способ получить предоставленный URL в виде строки, скажем

String url = "http://www.example.com/?param1=value1&param";

и легко преобразовать его в объект HttpServletRequest, чтобы я мог проверить его с помощью своих модульных тестов? Или хотя бы просто, чтобы request.getParameterMap и request.getParameter работали правильно?

Ответы [ 4 ]

39 голосов
/ 23 июня 2011

Spring имеет MockHttpServletRequest в своем модуле весеннего тестирования.

Если вы используете maven, вам может потребоваться добавить соответствующую зависимость к вашему pom.xml .Вы можете найти весенний тест на mvnrepository.com .

38 голосов
/ 23 июня 2011

Простейшие способы издеваться над HttpServletRequest:

  1. Создать анонимный подкласс:

    HttpServletRequest mock = new HttpServletRequest ()
    {
        private final Map<String, String[]> params = /* whatever */
    
        public Map<String, String[]> getParameterMap()
        {
            return params;
        }
    
        public String getParameter(String name)
        {
            String[] matches = params.get(name);
            if (matches == null || matches.length == 0) return null;
            return matches[0];
        }
    
        // TODO *many* methods to implement here
    };
    
  2. Использовать jMock , Mockito или какой-либо другой универсальный фреймворк:

    HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock
    HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito
    
  3. Используйте HttpUnit ServletUnit и не издевайтесьзапрос на все.

32 голосов
/ 02 декабря 2013

Вот как использовать MockHttpServletRequest:

// given
MockHttpServletRequest request = new MockHttpServletRequest();
request.setServerName("www.example.com");
request.setRequestURI("/foo");
request.setQueryString("param1=value1&param");

// when
String url = request.getRequestURL() + '?' + request.getQueryString(); // assuming there is always queryString.

// then
assertThat(url, is("http://www.example.com:80/foo?param1=value1&param"));
3 голосов
/ 23 июня 2011

Обычно вы тестируете подобные вещи в интеграционном тесте, который фактически подключается к сервису. Чтобы выполнить модульное тестирование, вы должны протестировать объекты, используемые методами doGet / doPost вашего сервлета.

Как правило, вы не хотите, чтобы в ваших методах сервлетов было много кода, вам нужно создать класс bean-компонента для обработки операций и передавать ему свои собственные объекты, а не объекты API сервлета.

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