• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Test metody @ControllerAdvice z użyciem Mockito - java

Object Storage Arubacloud
0 głosów
680 wizyt
pytanie zadane 9 października 2018 w Java przez newUser Użytkownik (520 p.)

Cześć,
muszę przetestować klasę, która łapie wyjątki w aplikacji przy pomocy Springowej adnotacji @ControllerAdvice i @ExceptionHandler
metody wyglądają tak jak poniżej :

```

public class Response {
    
    private String returnCode;
    private String returnLabel;

    public Response(String returnCode, String returnLabel) {
        this.returnCode = returnCode;
        this.returnLabel = returnLabel;
    }

    public String getReturnCode() {
        return returnCode;
    }

    public void setReturnCode(String returnCode) {
        this.returnCode = returnCode;
    }

    public String getReturnLabel() {
        return returnLabel;
    }

    public void setReturnLabel(String returnLabel) {
        this.returnLabel = returnLabel;
    }

    @Override
    public String toString() {
        return "Response{" +
                "returnCode='" + returnCode + '\'' +
                ", returnLabel='" + returnLabel + '\'' +
                '}';
    }
}


```

```

@ControllerAdvice
public class ExceptionHandler {
    
    @org.springframework.web.bind.annotation.ExceptionHandler(value = SomeException.class)
    public ResponseEntity<Response> handleSomeException(SomeException exception) {
        Response resp = new Response();
        resp.setReturnCode("SomeCode");
        resp.setReturnLabel(exception.getMessage());
        
        return new ResponseEntity<>(resp, HttpStatus.INTERNAL_SERVER_ERROR);

    }
}


```

Jesli chodzi o testy jednostkowe to zrobiłem je w taki sposób jak poniżej ale jest problem z asercją. Nie do końca wiem jak to poprawnie przetestować z Mockito, żeby zwiększyć Coverage w projekcie

 

```

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner)
public class TestSuite {
    
    private ExceptionHandler handler;
    
    @Mock
    private Response response;
    
    @Test
    public void testHandleSomeException() {
        handler = new ExceptionHandler();
        SomeException ex = new SomeException();

        when(response.getReturnCode()).thenReturn("SomeCode");
        when(response.getReturnLabel()).thenReturn(ex.getMessage());

        assertEquals(handler.handleSomeException(ex), new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR));
    }
}



```

Generalnie adviser działa ale nie wiem jak go dobrze przetestowac, obecnie mam

java.lang.AssertionError:
Expected :500 Internal Server Error, Response{returnCode='SomeCode', returnLabel='null'. - i tutaj też nie wiem dlaczego z ex.getMessage() idzie null w odpowiedzi ?
Actual : 500 Internal server error, response,{}

Będę bardzo wdzięczny za jakąś podpowiedź

2 odpowiedzi

+1 głos
odpowiedź 9 października 2018 przez Wiciorny Ekspert (270,170 p.)

Zanim przeglądne kod... dokładnie i odpowiem na wstepie : skoro twoja METODA- SPODZIEWA SIĘ "EXCEPTION" służy do wyłapania, to trzeba ją odpowiednio zaadnotować, podać informacje o tej możliwości np.

np...

@Test
public void testExceptionMessage() throws Exception

lub

@Test(expected = AnException.class)

sprawdź  może to rozwiąże, problem jak nie to siąde i przeglądne kod : 

 

 

when(response.getReturnCode()).thenReturn("SomeCode");

        when(response.getReturnLabel()).thenReturn(ex.getMessage());

okej, ale w takim razie ustawiasz ReturnCode ... z żądaniem zwrotu SomeCode... ale kod błędu to nie jest "messeges Exception error" więc labelReturn nie ma wartości, gdyż nie jest ustawione 

 

komentarz 9 października 2018 przez newUser Użytkownik (520 p.)
Kiedy dodaje expected = SomeException.class do adnotacji to przy wyniku pojawia się komunikat: "Unexpected exception (...) but was java.lang.AssertionError"

Tutaj mi głównie chodzi o to żeby pokryć linie z klasy ExceptionHandler, żeby InteliJ pokazywał koło 80% pokrycia. Te metody zwracają zawsze responseEntity i jakąś tam odpowiedź ustawioną już po tym jak wyjątek zostaje złapany. Później json z odpowiedzą leci gdzieś dalej. Takie testy, które powodują rzucenie konkretnego wyjątku już są napisane ale mi chodzi teraz bardziej o to pokrycie kodu , chyba że coś z tymi testami nie tak..
0 głosów
odpowiedź 9 października 2018 przez mbabane Szeryf (79,280 p.)

Wydaje mi się, że w tym przypadku to nie Response ma być mockiem tylko SomeException, ponieważ w tym teście chcesz sprawdzić czy odpowiedź budowana przez metodę handleSomeException jest prawidłowa. Możesz to zrobić dużo prościej niż Ci się wydaje:

@Test
public void testHandleSomeException() {
   handler = new ExceptionHandler();
   SomeException ex = mock(SomeException.class);
   when(ex.getMessage()).thenReturn("mockMSG");
        
   ResponseEntity<Response> actual = handler.handleSomeException(ex);
   assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, actual.getStatusCode() ); 
          
   Response actualResponse = actual.getBody();
   String expectedCode = "SomeCode";
   assertEquals(expectedCode, actualResponse.getReturnCode() );

   String expectedLabel = "mockMSG";
   assertEquals(expectedLabel, actualResponse.getReturnLabel() );      
}

Możesz jeszcze przetestować to integracyjne tzn. czy kontroler, do którego jest przypisany ExceptionHandler rzeczywiście wywołuje podaną metodę tak jak trzeba. Ale to musisz wygooglować bo ja nigdy jeszcze nie używałem ControllerAdvice - wpisz coś na zasadzie spring how to test controllerAdvice.

komentarz 10 października 2018 przez newUser Użytkownik (520 p.)
Dziękuje za podpwiedź :)

Podobne pytania

0 głosów
0 odpowiedzi 260 wizyt
pytanie zadane 16 marca 2017 w JavaScript przez Kuba Pyda Początkujący (310 p.)
0 głosów
0 odpowiedzi 433 wizyt
pytanie zadane 21 maja 2020 w Java przez potrzebujacaPomocy Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 500 wizyt
pytanie zadane 6 kwietnia 2018 w Java przez newUser Użytkownik (520 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...