2011-06-23 30 views
47

Tengo un servicio que hace algo de trabajo en un objeto HttpServletRequest, utilizando específicamente request.getParameterMap y request.getParameter para construir un objeto.Creando un simulador HttpServletRequest fuera de una cadena url?

Me preguntaba si hay una manera fácil de tomar una url proporcionada, en forma de una cadena, dicen

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

y fácilmente convertirlo en un objeto HttpServletRequest para que pueda probarlo con mi pruebas unitarias? ¿O al menos solo para que request.getParameterMap y request.getParameter funcionen correctamente?

Respuesta

29

Spring tiene MockHttpServletRequest en su módulo de prueba de muelles.

Si está utilizando maven, es posible que necesite agregar la dependencia adecuada a su pom.xml. Puede encontrar la prueba de primavera en mvnrepository.com.

+0

Esto sin duda se parece a la forma más fácil de hacerlo. ¡Muchas gracias! – Anthony

+2

No puedo hacer que esto funcione. ¿Cómo debe usarse? – varunl

+0

El número de dependencias 'spring-test' es simplemente una locura. Ya tropecé con algunas colisiones :( –

2

Por lo general, probará 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 usados ​​por los métodos doGet/doPost de su servlet.

En general, no desea tener mucho código en sus métodos de servlet, es posible que desee crear una clase de bean para manejar las operaciones y pasar sus propios objetos a él y no a los objetos de la API de servlet.

+1

Por otra parte, ¿por qué pasaría la oportunidad de aumentar la cobertura de su prueba (es decir, la robustez de su código) solo porque el método toma un cierto tipo de parámetro como entrada? – pap

+1

Depende, ¿está intentando? para probar la API servlet o estás intentando probar tu propio código? –

+3

"En general" no quieres tener ningún código en tus métodos servlet. En la práctica, siempre lo harás. Y tendrás clases auxiliares , métodos de utilidad, análisis sintáctico, validaciones, traducciones de modelos y, a veces, hasta lógica de negocios (¡el horror!). Y ya que lo hace, querrá probarlos en una unidad. Y por eso, querrá simular solicitudes de servlets cree escenarios de prueba bien definidos. Hacer burla de la API de servlet es precisamente lo OPUESTO de probarlo. Lo está eliminando del caso de prueba por completo. – pap

35

formas más sencillas para burlarse de un HttpServletRequest:

  1. Crear 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 
    }; 
    
  2. Uso jMock, Mockito, o algún otro propósito general marco de burla:

    HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock 
    HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito 
    
  3. Usar HttpUnit ServletUnit y no se burle de la solicitud en absoluto.

23

Aquí es cómo utilizar 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")); 
+1

El uso de este MockHttpServletRequest en realidad hace el trabajo, ya que solo necesitaba una HttpServletRequest totalmente funcional – Silentbang

+0

Tenga en cuenta que al establecer queryString, el parámetro Map no se actualiza automáticamente en MockHttpServletRequest. Por lo tanto, si usa request.getParameter() en su código, primero deberá establecer explícitamente la configuración de la prueba, aunque parezca redundante al principio. – inovaovao

Cuestiones relacionadas