Test zwraca true, podczas gdy powinien zwrócić false i na odwrót

0

Ciąg dalszy mojego wątku Zły status zwracany z testu Mockito. Udało mi się samemu dojść do źródła problemu. Jednak teraz pojawił się inny.
Otóż ta metoda

@GetMapping("/checkUsernameAtRegistering")
public HttpEntity<Boolean> checkUsernameAtRegistering(@RequestParam String username) {
        return ResponseEntity.ok().body(!userService.existsByUsername(username));
}

po otrzymaniu username i sprawdzeniu w bazie powinna zwrócić false, jeśli username istnieje.
Jednak test

@Test
    public void textExistsUsername() throws Exception {
        mockMvc
                .perform(get("/checkUserData/checkUsername")
                .param("username", "jonki97"))
                .andExpect(status().isOk())
                .andExpect(content().string("false"));
    }

zwraca mi true. Posiadam użytkownika o takim username, i metoda powinna zwrócić false. A tak nie jest.

java.lang.AssertionError: Response content 
Expected :true
Actual   :false

Chyba dobrze rozumiem składnię

.andExpect(content().string("false"));

że oczekuję stringa o wartości false.

0

A gdzie ty tam masz w ogóle setup tego serwisu mockowanego żeby zwracał ci true? o_O Bo zamockowałeś go ale nigdzie nie ma żadnego expecta. Cud że w ogóle to działa, pewnie mockito defaultowo daje tam nice mocka który na wszystkie nieoczekiwane wywołania zwraca null/0/false.

0
Shalom napisał(a):

pewnie mockito defaultowo daje tam nice mocka który na wszystkie nieoczekiwane wywołania zwraca null/0/false.

Lol @Shalom to ty nie wiedziałeś że jak zamockujesz serwis ale nie powiesz mu co ma zwracać, to defaultowo zwróci właśnie false/0? :P

0

@Pinek: no właśnie tak nie zrobi. To jest zachowanie tzw "nice mock" i np. EasyMock domyślnie go nie stosuje. Tworząc "zwykłego" mocka dostajesz takiego który wali wyjatkiem kiedy wywołasz coś co nie zostało oznaczone jako expect. Żeby było inaczej musisz explicite stworzyć sobie nice mock. Faktycznie w praktyce częściej korzysta sie z nice mocków, ale jeśli ktoś nie rozumie jak one działaja to potem są takie kwiatki jak powyżej.

0

Chodzi Wam o coś takiego?

@Test
    public void textExistsUsername() throws Exception {
        when(userService.existsByUsername("jonki97")).thenReturn(true);

        mockMvc
                .perform(get("/checkUserData/checkUsername")
                .param("username", "jonki97"))
                .andExpect(status().isOk())
                .andExpect(content().string("true"));
    }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.