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
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¶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"));
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
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.
Mattball
Die einfachsten Möglichkeiten, ein zu verspotten HttpServletRequest:
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
};
Verwenden jMock, Mockitooder ein anderes Allzweck-Mocking-Framework:
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.
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)
}
12074400cookie-checkErstellen einer Schein-HttpServletRequest aus einer URL-Zeichenfolge?yes