Erstellen einer Schein-HttpServletRequest aus einer URL-Zeichenfolge?

Lesezeit: 3 Minuten

Ich habe einen Dienst, der einige Arbeiten an einem HttpServletRequest-Objekt ausführt, insbesondere mithilfe von request.getParameterMap und request.getParameter, um ein Objekt zu erstellen.

Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, eine bereitgestellte URL, beispielsweise in Form einer Zeichenfolge, zu übernehmen

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

und einfach in ein HttpServletRequest-Objekt konvertieren, damit ich es mit meinen Komponententests testen kann? Oder zumindest nur damit request.getParameterMap und request.getParameter richtig funktionieren?

So verwenden Sie 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"));

  • Die Verwendung dieses MockHttpServletRequest erfüllt tatsächlich die Aufgabe, da ich nur einen voll funktionsfähigen HttpServletRequest benötigte

    – Duc Tran

    8. April 2015 um 17:59 Uhr

  • Beachten Sie, dass beim Setzen des queryString der Parameter Map in MockHttpServletRequest nicht automatisch aktualisiert wird. Wenn Sie also request.getParameter() in Ihrem Code verwenden, müssen Sie es zuerst explizit im Testsetup festlegen, auch wenn es auf den ersten Blick überflüssig erscheint.

    – Nicola Ambrosetti

    24. November 2016 um 8:48 Uhr


  • Mir ist das gleiche aufgefallen. Abfragezeichenfolge und Parameter scheinen nicht synchronisiert zu werden

    – Raj

    20. September 2019 um 4:03 Uhr

  • Dafür wird jee api jar 6 oder 8 benötigt.

    – Intelligenter Codierer

    1. Juli 2020 um 18:07 Uhr

  • Veraltet docs.spring.io/spring-framework/docs/current/javadoc-api/org/…

    – Die_Stärke der Einfachheit

    13. September 2021 um 16:51 Uhr

Benutzer-Avatar
Brei

Der Frühling hat MockHttpServletRequest in seinem Frühjahr-Test-Modul.

Wenn Sie maven verwenden, müssen Sie möglicherweise die entsprechende Abhängigkeit zu Ihrer hinzufügen pom.xml. Federtest finden Sie unter mvnrepository.com.

Benutzer-Avatar
Mattball

Die einfachsten Möglichkeiten, ein zu verspotten HttpServletRequest:

  1. Erstellen Sie eine anonyme Unterklasse:

    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. Verwenden jMock, Mockitooder ein anderes Allzweck-Mocking-Framework:

    HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock
    HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito
    
  3. Verwenden Sie HttpUnits ServletUnit und verspotten Sie die Anfrage überhaupt nicht.

  • Was ist das WAS in den Kommentaren?

    – ruby_object

    19. November 2020 um 16:05 Uhr

  • @ruby_object was auch immer eine Karte von Parametern ist, die im Komponententest analysiert werden sollen. Wenn wir dann URL/?search=xyz übergeben, wird dies was auch immer die Zuordnung der Suche nach xyz enthalten.

    – ankush__

    21. September 2021 um 10:55 Uhr

  • Lösung 1 wird nicht funktionieren, da HttpServletRequest kann nicht konstruiert werden.

    – basZero

    8. Juni um 13:14 Uhr

Im Allgemeinen würden Sie solche Dinge in einem Integrationstest testen, der tatsächlich eine Verbindung zu einem Dienst herstellt. Um einen Komponententest durchzuführen, sollten Sie die Objekte testen, die von den doGet/doPost-Methoden Ihres Servlets verwendet werden.

Im Allgemeinen möchten Sie nicht viel Code in Ihren Servlet-Methoden haben, Sie möchten eine Bean-Klasse erstellen, um Operationen zu verarbeiten und Ihre eigenen Objekte und keine Servlet-API-Objekte an sie zu übergeben.

Benutzer-Avatar
mel3kings

für diejenigen, die nach einer Möglichkeit suchen, sich zu verspotten POST HttpServletRequest mit Json-Nutzlast, das Folgende ist in Kotlin, aber der Schlüssel zum Mitnehmen hier ist das DelegatingServetInputStream wenn du das verspotten willst request.getInputStream von dem 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)
}

1207440cookie-checkErstellen einer Schein-HttpServletRequest aus einer URL-Zeichenfolge?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy