• 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

VPS Starter Arubacloud
0 głosów
643 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 (269,120 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 257 wizyt
pytanie zadane 16 marca 2017 w JavaScript przez Kuba Pyda Początkujący (310 p.)
0 głosów
0 odpowiedzi 422 wizyt
pytanie zadane 21 maja 2020 w Java przez potrzebujacaPomocy Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 491 wizyt
pytanie zadane 6 kwietnia 2018 w Java przez newUser Użytkownik (520 p.)

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...