Ответ 1
Spring имеет MockHttpServletRequest в своем модуле spring -test.
Если вы используете maven, вам может потребоваться добавить соответствующую зависимость к вашему pom.xml. Вы можете найти spring -test в mvnrepository.com.
У меня есть служба, которая выполняет некоторую работу над объектом HttpServletRequest, в частности, используя request.getParameterMap и request.getParameter для создания объекта.
Мне было интересно, есть ли простой способ взять предоставленный url в виде строки, скажем
String url = "http://www.example.com/?param1=value1¶m";
и легко преобразовать его в объект HttpServletRequest, чтобы я мог проверить его с помощью моих модульных тестов? Или, по крайней мере, так, чтобы request.getParameterMap и request.getParameter работали правильно?
Spring имеет MockHttpServletRequest в своем модуле spring -test.
Если вы используете maven, вам может потребоваться добавить соответствующую зависимость к вашему pom.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"));
Обычно вы тестируете подобные вещи в тесте интеграции, который фактически соединяется с сервисом. Чтобы выполнить unit test, вы должны проверить объекты, используемые вашими методами doGet/doPost.
В общем, вы не хотите иметь много кода в своих методах сервлета, вы бы хотели создать класс bean для обработки операций и передачи своих собственных объектов, а не объектов сервлета API.