0 Tage Serie
java / intermediate
Snippet

Isolierte Controller-Validierungstests mit @WebMvcTest

@WebMvcTest lädt ausschließlich die Web-Schicht, ohne den vollständigen Service- und Repository-Kontext zu starten. In Kombination mit MockMvc und @MockBean ermöglicht dies zielgerichtete Tests von HTTP-Statuscodes, Payload-Serialisierung und Jakarta Bean Validation-Einschränkungen.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void whenInvalidEmail_thenReturnsUnprocessableEntity() throws Exception {
String invalidPayload = "{\"email\": \"not-an-email\"}";
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content(invalidPayload))
.andExpect(status().isUnprocessableEntity())
.andExpect(jsonPath("$.errors[0].field").value("email"));
}
}
spring
Erklärung
1
@WebMvcTest(UserController.class)
Instanziiert nur den angegebenen Controller und die zugrunde liegende Spring-MVC-Infrastruktur.
2
@MockBean private UserService userService;
Injiziert ein Mockito-Mock in den Kontext, um die Web-Schicht von Geschäftslogik abzukoppeln.
3
mockMvc.perform(post("/api/users")...)
Simuliert einen eingehenden HTTP-POST-Request mit JSON-Nutzlast an den Endpunkt.
4
.andExpect(status().isUnprocessableEntity())
Stellt sicher, dass der Validierungsfehler einen HTTP-422-Statuscode auslöst.