Tengo un servicio que funciona en un objeto HttpServletRequest, específicamente usando request.getParameterMap y request.getParameter para construir un objeto.
Me preguntaba si hay una forma sencilla de tomar una URL proporcionada, en forma de cadena, digamos
String url = "http://www.example.com/?param1=value1¶m";
y convertirlo fácilmente en un objeto HttpServletRequest para poder probarlo con mis pruebas unitarias? ¿O al menos solo para que request.getParameterMap y request.getParameter funcionen correctamente?
Aquí está cómo usar 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"));
-
El uso de este MockHttpServletRequest en realidad hace el trabajo, ya que solo necesitaba un HttpServletRequest completamente funcional
– Duc Tran
08/04/2015 a las 17:59
-
Tenga en cuenta que al configurar queryString, el parámetro Map no se actualiza automáticamente en MockHttpServletRequest. Entonces, si usa request.getParameter() en su código, primero deberá configurarlo explícitamente en la configuración de prueba, aunque al principio pueda parecer redundante.
– Nicola Ambrosetti
24 de noviembre de 2016 a las 8:48
-
Me di cuenta de lo mismo. La cadena de consulta y los parámetros no parecen sincronizarse
– Raj
20 de septiembre de 2019 a las 4:03
-
Se necesitará jee api jar 6 u 8 para esto.
– Codificador inteligente
1 de julio de 2020 a las 18:07
-
Anticuado docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
– Simplicity’s_Strength
13/09/2021 a las 16:51
papilla
la primavera tiene MockHttpServletRequest en su módulo de prueba de resorte.
Si está utilizando maven, es posible que deba agregar la dependencia adecuada a su pom.xml. Puede encontrar la prueba de primavera en mvnrepository.com.
pelota mate
Formas más simples de burlarse de un HttpServletRequest
:
-
Crea una subclase anónima:
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 };
-
Usar jMock, Mockitoo algún otro marco de simulación de propósito general:
HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito
-
Usa HttpUnit’s ServletUnit y no te burles de la solicitud en absoluto.
-
¿Cuál es el LO QUE en los comentarios?
– ruby_object
19 de noviembre de 2020 a las 16:05
-
@ruby_object lo que sea Mapa de parámetros que se analizarán en la prueba unitaria. Cuando pasemos URL/?search=xyz entonces, este lo que sea contendrá el mapeo de búsqueda de xyz.
– ankush__
21/09/2021 a las 10:55
-
La solución 1 no funcionará, ya que
HttpServletRequest
no se puede construir.– basZero
8 de junio a las 13:14
Por lo general, probaría este tipo de cosas en una prueba de integración, que en realidad se conecta a un servicio. Para hacer una prueba unitaria, debe probar los objetos utilizados por los métodos doGet/doPost de su servlet.
En general, no desea tener mucho código en sus métodos de servlet, desearía crear una clase de bean para manejar operaciones y pasarle sus propios objetos y no objetos de API de servlet.
mel3reyes
para aquellos que buscan una manera de burlarse POST
HttpServletRequest con carga útil Json, lo siguiente está en Kotlin, pero la clave para llevar aquí es el DelegatingServetInputStream cuando te quieres burlar request.getInputStream
desde el HttpServletRequest
@Mock
private lateinit var request: HttpServletRequest
@Mock
private lateinit var response: HttpServletResponse
@Mock
private lateinit var chain: FilterChain
@InjectMocks
private lateinit var filter: ValidationFilter
@Test
fun `continue filter chain with valid json payload`() {
val payload = """{
"firstName":"aB",
"middleName":"asdadsa",
"lastName":"asdsada",
"dob":null,
"gender":"male"
}""".trimMargin()
whenever(request.requestURL).
thenReturn(StringBuffer("/profile/personal-details"))
whenever(request.method).
thenReturn("PUT")
whenever(request.inputStream).
thenReturn(DelegatingServletInputStream(ByteArrayInputStream(payload.toByteArray())))
filter.doFilter(request, response, chain)
verify(chain).doFilter(request, response)
}