Создание макета HttpServletRequest из строки url?
У меня есть служба, которая выполняет некоторую работу над объектом HttpServletRequest, в частности с помощью запроса.getParameterMap и запрос.getParameter для построения объекта.
мне было интересно, есть ли простой способ взять предоставленный url-адрес в виде строки, скажем
String url = "http://www.example.com/?param1=value1¶m";
и легко преобразовать его в объект HttpServletRequest, чтобы я мог проверить его с помощью своих модульных тестов? Или хотя бы просто так эту просьбу.getParameterMap и запрос.getParameter правильно работать?
4 ответа:
Весна MockHttpServletRequest в своем модуле весн-испытания.
Если вы используете maven, вам может потребоваться добавить соответствующую зависимость к вашему пом.xml. Вы можете найти spring-test на mvnrepository.com.
простейшие способы издеваться над
HttpServletRequest
:
создать анонимный подкласс:
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 };
использовать jMock,Mockito, или какая - то другая универсальная насмешливая структура:
HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito
использовать HttpUnit это ServletUnit и не издевайтесь над просьбой вообще.
вот как использовать MockHttpServletRequest:
// given MockHttpServletRequest request = new MockHttpServletRequest(); request.setServerName("www.example.com"); request.setRequestURI("/foo"); request.setQueryString("param1=value1¶m"); // when String url = request.getRequestURL() + '?' + request.getQueryString(); // assuming there is always queryString. // then assertThat(url, is("http://www.example.com:80/foo?param1=value1¶m"));
обычно вы тестируете такие вещи в интеграционном тесте, который фактически подключается к службе. Чтобы выполнить модульный тест, вы должны проверить объекты, используемые методами doget/doPost вашего сервлета.
В общем случае вы не хотите иметь много кода в своих методах сервлета, вы хотели бы создать класс bean для обработки операций и передать ему свои собственные объекты, а не объекты API сервлета.