JUnit RestControllerTest @PutMapping के लिए InvocationTargetException फेंकता है

Sep 14 2020

मैं स्प्रिंग बूट का उपयोग करके एक माइक्रो-सर्विस का निर्माण कर रहा हूं। मैंने GET-, POST-, PUT-, DELETE- मेथड्स के साथ एक एपीआई लिखा, एप्लिकेशन चलाएँ और पोस्टमैन का उपयोग करके इसका परीक्षण किया - सब कुछ ठीक काम कर रहा है ...

लेकिन PUT- विधि का परीक्षण विफल रहता है

java.lang.AssertionError: स्थिति अपेक्षित: <204> लेकिन थी: <400>

डिबग-मोड में परीक्षण चलाना और थ्रो को फेंकना एक InvocationTargetException:

मेरे RestController- तरीके इस तरह दिखता है:

@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 (आईडी):

@Override
public SongDto getSongById(Integer id) {
    return songMapper.songToSongDto(songRepository.findById(id)
        .orElseThrow(NotFoundException::new));
}

SongRepository सिर्फ एक सरल इंटरफ़ेस है जो JpaRepository <Song, Integer> का विस्तार करता है।

मेरा असफल परीक्षण इस तरह दिखता है:

@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());
}

और getValidSongDto () सिर्फ मेरे परीक्षणों में उपयोग किया जाने वाला एक Dto प्रदान करता है:

private SongDto getValidSongDto() {
    return SongDto.builder()
            .id(1)
            .title("TestSongValid")
            .label("TestLabelValid")
            .genre("TestGenreValid")
            .artist("TestArtistValid")
            .released(1000)
            .build();
}

मैं वास्तव में इस समय समझ नहीं पा रहा हूं कि इस परीक्षा को विफल करने के लिए मैंने क्या गलत किया और इंटरनेट में ऐसा कुछ भी नहीं पाया जिससे मुझे इस समस्या को हल करने में मदद मिली हो, अब तक। इसलिए, अगर मैं किसी को भी बताऊं कि मैं यहां क्या गलत है और इस मुद्दे को कैसे हल कर सकता हूं, तो मैं बहुत आभारी हूं।

आपका बहुत बहुत धन्यवाद!!

जवाब

2 SSK Sep 14 2020 at 21:02

आपको songService.getSongByIdनीचे दिखाए गए अनुसार मान लौटाना होगा

@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());
}