web-dev-qa-db-fra.com

Création d'une requête simulée HttpServletRequest à partir d'une chaîne d'URL?

J'ai un service qui travaille sur un objet HttpServletRequest, en utilisant spécifiquement le request.getParameterMap et le request.getParameter pour construire un objet.

Je me demandais s'il existe un moyen simple de prendre une URL fournie, sous la forme d'une chaîne, par exemple

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

et le convertir facilement en un objet HttpServletRequest afin que je puisse le tester avec mes tests unitaires? Ou au moins juste pour que request.getParameterMap et request.getParameter fonctionnent correctement?

59
Anthony

Spring a MockHttpServletRequest dans son module de test de ressort.

Si vous utilisez maven, vous devrez peut-être ajouter la dépendance appropriée à votre pom.xml . Vous pouvez trouver le test de printemps sur mvnrepository.com .

39
pap

Les manières les plus simples de se moquer d'un HttpServletRequest:

  1. Créez une sous-classe anonyme:

    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. Utilisez jMock , Mockito , ou un autre framework moqueur à usage général:

    HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock
    HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito
    
  3. Utilisez ServletUnit de HttpUnit et ne vous moquez pas de la requête du tout.

38
Matt Ball

Voici comment utiliser 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"));
32
Guito

En règle générale, vous testez ce type de choses dans un test d'intégration, qui se connecte à un service. Pour effectuer un test unitaire, vous devez tester les objets utilisés par les méthodes doGet/doPost de votre servlet.

En général, vous ne voulez pas avoir beaucoup de code dans vos méthodes de servlet, vous voulez créer une classe de bean pour gérer les opérations et lui transmettre vos propres objets et non des objets API de servlet.

3
Triton Man