JUnit RestControllerTest pour @PutMapping lève InvocationTargetException
Je construis un microservice à l'aide de Spring Boot. J'ai écrit une API avec les méthodes GET-, POST-, PUT-, DELETE-, j'ai exécuté l'application et l'ai testée à l'aide de Postman - tout fonctionne bien ...
Mais le test de la méthode PUT échoue avec
java.lang.AssertionError: état attendu: <204> mais était: <400>
Exécuter le test en mode débogage et lancer pas à pas lève une InvocationTargetException:
Mes méthodes RestController ressemblent à ceci:
@PutMapping(value = "/{id}")
public ResponseEntity updateSongById(@PathVariable("id") Integer id, @RequestBody @Validated
SongDto songDto) {
// TODO Add authorization
SongDto song = songService.getSongById(id);
if (song == null)
return new ResponseEntity(HttpStatus.BAD_REQUEST);
return new ResponseEntity(songService.updateSong(id, songDto), HttpStatus.NO_CONTENT);
}
songService.getSongById (id):
@Override
public SongDto getSongById(Integer id) {
return songMapper.songToSongDto(songRepository.findById(id)
.orElseThrow(NotFoundException::new));
}
Le SongRepository est juste une interface simple qui étend JpaRepository <Song, Integer>.
Mon test échoué ressemble à ceci:
@Test
void updateSongById_success() throws Exception {
when(songService.updateSong(anyInt(), any(SongDto.class))).thenReturn(getValidSongDto());
String songDtoJson = objectMapper.writeValueAsString(getValidSongDto());
mockMvc.perform(put("/rest/v1/songs/1")
.content(songDtoJson)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isNoContent());
}
Et getValidSongDto () fournit juste un Dto utilisé dans mes tests:
private SongDto getValidSongDto() {
return SongDto.builder()
.id(1)
.title("TestSongValid")
.label("TestLabelValid")
.genre("TestGenreValid")
.artist("TestArtistValid")
.released(1000)
.build();
}
Je ne comprends vraiment pas pour le moment, ce que j'ai fait de mal pour faire échouer ce test et je n'ai rien trouvé sur Internet qui m'ait aidé à résoudre ce problème, jusqu'à présent. Alors, je serais très reconnaissant si quelqu'un pouvait me dire ce qui ne va pas ici et comment résoudre ce problème.
Merci beaucoup!!
Réponses
Vous devez renvoyer la valeur pour songService.getSongByIdcomme indiqué ci-dessous
@Test
void updateSongById_success() throws Exception {
when(songService.getSongById(Mockito.any())).thenReturn(getValidSongDto());
when(songService.updateSong(anyInt(), any(SongDto.class))).thenReturn(getValidSongDto());
String songDtoJson = objectMapper.writeValueAsString(getValidSongDto());
mockMvc.perform(put("/rest/v1/songs/1")
.content(songDtoJson)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isNoContent());
}