Mam prosty test integracyjny
@Test
public void shouldReturnErrorMessageToAdminWhenCreatingUserWithUsedUserName() throws Exception {
mockMvc.perform(post("/api/users").header("Authorization", base64ForTestUser).contentType(MediaType.APPLICATION_JSON)
.content("{\"userName\":\"testUserDetails\",\"firstName\":\"xxx\",\"lastName\":\"xxx\",\"password\":\"xxx\"}"))
.andDo(print())
.andExpect(status().isBadRequest())
.andExpect(?);
}
W ostatnim wierszu chcę porównać ciąg otrzymany w treści odpowiedzi z oczekiwanym ciągiem
W odpowiedzi otrzymuję:
MockHttpServletResponse:
Status = 400
Error message = null
Headers = {Content-Type=[application/json]}
Content type = application/json
Body = "Username already taken"
Forwarded URL = null
Redirected URL = null
Próbowałem kilku sztuczek z content (), body (), ale nic nie działało.
java
spring
mocking
spring-test-mvc
pbarański
źródło
źródło
"Username already taken"
. To powinno być bardziej konfliktem 409.Odpowiedzi:
Możesz wywołać
andReturn()
i użyć zwróconegoMvcResult
obiektu, aby uzyskać zawartość jakoString
.Patrz poniżej:
źródło
@RestController
wskazuje, że wszystkie metody obsługi są domyślnie opatrzone adnotacjami@ResponseBody
. Oznacza to, że Spring użyje aHttpMessageConverter
do serializacji wartości zwracanej przez moduł obsługi i zapisania go w odpowiedzi. Możesz bardzo mocno zdobyć ciałocontent()
.getContentAsString()
który pochodzi od mojego@RestController
kontrolera z adnotacjami.result.getResponse().getErrorMessage()
andReturn
zwraca aMvcResult
, jak określono w javadoc tutaj .@Sotirios Delimanolis odpowiedź wykonuje pracę, ale szukałem porównywania ciągów w ramach tego twierdzenia mockMvc
Więc oto jest
Oczywiście moje twierdzenie się nie powiedzie:
ponieważ:
To dowód na to, że działa!
źródło
.andExpect(content().string(containsString("\"Username already taken");
org.hamcrest.Matchers.containsString()
.org.hamcrest.Matchers.equalToIgnoringWhiteSpace()
Matchera do zignorowania wszystkich białych znaków. Może będzie to przydatna wskazówka dla kogośSpring MockMvc ma teraz bezpośrednie wsparcie dla JSON. Więc po prostu mówisz:
i w przeciwieństwie do porównania ciągów, powie coś w rodzaju „brak pola xyz” lub „komunikat Oczekiwany„ ok ”dostał„ nok ”.
Metodę tę wprowadzono wiosną 4.1.
źródło
ContentRequestMatchers
też obsługiwać tej funkcji?Czytając te odpowiedzi, widzę wiele związanych z wersją Spring 4.x, używam wersji 3.2.0 z różnych powodów. Tak więc rzeczy takie jak wsparcie JSON od samego początku
content()
nie jest możliwe.Odkryłem, że używanie
MockMvcResultMatchers.jsonPath
jest naprawdę łatwe i działa na ucztę. Oto przykład testowania metody postu.Zaletą tego rozwiązania jest to, że nadal dopasowujesz atrybuty, a nie polegasz na pełnych porównaniach ciągów JSON.
(Za pomocą
org.springframework.test.web.servlet.result.MockMvcResultMatchers
)Treść żądania była tylko ciągiem json, który można łatwo załadować z prawdziwego fałszywego pliku danych json, jeśli chcesz, ale nie uwzględniłem go tutaj, ponieważ odbiegałoby to od pytania.
Rzeczywisty zwrócony Json wyglądałby tak:
źródło
Zaczerpnięte z samouczka wiosny
is
jest dostępny odimport static org.hamcrest.Matchers.*;
jsonPath
jest dostępny odimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
i
jsonPath
referencje można znaleźć tutajźródło
error: incompatible types: RequestMatcher cannot be converted to ResultMatcher
dla.andExpect(content().contentType(contentType))
Wiosenna ochrona
@WithMockUser
icontainsString
dopasowanie hamcresta tworzą proste i eleganckie rozwiązanie:Więcej przykładów na github
źródło
Oto przykład, jak parsować odpowiedź JSON, a nawet jak wysłać zapytanie z komponentem bean w formie JSON:
Jak widać tutaj,
Book
jest to żądanie DTO iUpdateBookResponse
obiekt odpowiedzi przeanalizowany z JSON. Możesz zmienićObjectMapper
konfigurację Jaksona .źródło
To powinno dać ci odpowiedź. „Nazwa użytkownika jest już zajęta” w twoim przypadku.
źródło
tutaj bardziej elegancki sposób
źródło
Możesz użyć metody „getContentAsString”, aby uzyskać dane odpowiedzi w postaci ciągu.
Możesz skorzystać z tego linku do aplikacji testowej.
źródło
Jednym z możliwych podejść jest po prostu uwzględnienie
gson
zależności:i przeanalizuj wartość, aby dokonać weryfikacji:
źródło