Nieoczekiwany wynik testu

0

Hej chciałem napisać test metody zmieniającej hasło użytkownika. Metoda działa poprawnie testując ją w postmanie i test jest poprawny w momencie kiedy nie testuje wyjątku.

  public String updateUserPassword(UpdatePasswordDto user)
    {
        try {
            UserDetails userDetails= manager.loadUserByUsername(user.getUserName());
            manager.updatePassword(userDetails,encoder.encode(user.getPassword()));
            return user.getUserName();
        }
        catch (UsernameNotFoundException e) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
        }
    }
   @PutMapping
    public ResponseEntity<String> updateUser(@RequestBody UpdatePasswordDto user)
    {
        HttpHeaders headers= new HttpHeaders();
        try{
            String userName=userService.updateUserPassword(user);
            headers.add("successfull","true");
            return new ResponseEntity<>(user.getUserName(),headers, HttpStatus.OK);
        }
        catch (ResponseStatusException e)
        {
            headers.add("successfull","false");
            return new ResponseEntity<>("No such a user found",headers, HttpStatus.BAD_REQUEST);
        }
    }

 @Test
    @WithMockUser(username = "admin", authorities = {"ADMIN"})
    public void shouldThrowExceptionUpdatePassword() throws Exception {

        UpdatePasswordDto pass=new UpdatePasswordDto("Test","Jerzy");
        
        when(userService.updateUserPassword(pass))
                .thenThrow(new ResponseStatusException(HttpStatus.NOT_FOUND));
        
        MvcResult s = mvc.perform(put("/api/user")
                .header("indicatorcolor","green")
                .contentType(MediaType.APPLICATION_JSON)
                .content(asJsonString(pass)))
                .andExpect(status().is(400))
                .andReturn();
    }
}

Kompletnie nie mam pojęcia co jest źle, a pewnie jest to oczywisty błąd.

5
when(userService.updateUserPassword(pass)).thenThrow(new ResponseStatusException(HttpStatus.NOT_FOUND));

Co to za raczysko? Ty nie testujesz aplikacji tylko mockito i integracje Springa z mockito

headers.add("successfull","true");

WUT? Nie robi się takich headerów oO. Od tego jest status/response body ew. location header (ale to scieżka do zasobu)

A poza tym podepnij się debugierem w testach i zobacz co się dzieje ;) Podejrzewam że asJsonString powoduje że jest nowy obiekt UpdatePasswordDto i referencje się nie zgadzają przy:

 when(userService.updateUserPassword(pass))
                .thenThrow(new ResponseStatusException(HttpStatus.NOT_FOUND));

To jest jakaś klasa? Jest equals zaimplementowany?

3

Ten kod to jest dramat. Logika w kontrolerze, repozytorium/serwis które rzucaja wyjątek z jakimś HttpStatus.BAD_REQUEST a przecież nie powinny w ogóle wiedzieć ze tam jest jakieś http. Jakiś cyrk z headerami...
Wracając do głownego problemu: czemu nie testujesz tego jak człowiek z jakąs bazą in-memory tylko robisz takie cuda na kiju z mockowaniem repozytorium? o_O Tak jak wyżej, ten twój when nie działa, bo argumentem updateUserPassword będzie zupełnie inny obiekt. Ale nawet jakby działało, to taki test jest bardzo bardzo zły, bo sprawdza na dobrą sprawę jak wyglada kod a nie co robi kod. W teście w ogóle nie powinno cię interesować że istnieje jakis obiekt userService ani że ma taką czy inną metodę. Powinno cię interesować jedynie że dla nieistniejacego użytkownika rzuca błędem. Zapraszam: https://github.com/Pharisaeus/almost-s3

Porównaj to co napisałeś np. z https://github.com/Pharisaeus/almost-s3/blob/master/test/src/test/java/net/forprogrammers/almosts3/test/DownloadTest.java#L105 który test jest czytelniejszy (już nawet pomijając kwestie że ten faktycznie coś testuje...)

1 użytkowników online, w tym zalogowanych: 0, gości: 1