Testowanie endpointów z Mock MVC i Unit test w Springu

Odpowiedz Nowy wątek
2020-05-22 14:36

Rejestracja: 1 rok temu

Ostatnio: 2 godziny temu

0

Hej, wiecie pomoglibyście mi w nakierowaniu jak przestestować endpointy przy użyciu testów jednostkowych i Mock MVC??Przesyłam trzy klasy :
AttachmentController, który już jest gotowy
AttachmentRestTemplate który mi triggeruje odpowiednio endpointy (nie dokończone)
AttachmentControllerTest (niedokończone)

Głównie to mi zależy na :
/accident/{id}/admin-attachment
/accident/{accidentId}/admin-attachment/{attachmentId}
/accident/{id}/admin-attachment
/accident/{accidentId}/admin-attachment/{attachmentId}

i kod źródłowy:
https://paste.ofcode.org/5cA9BwqNdSxByV4xMRPZek
https://paste.ofcode.org/RBGiGMPy28APMqfUCt4kJU
https://paste.ofcode.org/39JU3XMyTUYvfZEDf8bUVRq

Z góry dziękuję :)

Pozostało 580 znaków

2020-05-22 14:38
Moderator

Rejestracja: 16 lat temu

Ostatnio: 14 minut temu

4

To bardzo proste: nie używać MockMVC bo to rak.

  1. Stawiasz aplikacje, np. za pomocą @SpringBooTest
  2. Uderzasz w prawdziwe endpointy, ale nie jakimś dziwnym mock mvc tylko normalnym http clientem.
  3. Werifykujesz czy odpowiedzi zgadzają sie z tym czego oczekujesz.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 4x, ostatnio: Shalom, 2020-05-22 14:40
@Shalom A nie uważasz że pisanie testów jednostkowych ze SpringBoot'em to trochę bez sensu? Takie testy muszą odpalić cały kontekst springa co tragicznie wpłynie na szybkość wykonywania. Wydaje mi się że zwykłe mockowanie serwisów wystarczy, przynajmniej "zabezpieczy" istniejący kod przed intruzami. Uderzanie w endpointy raczej bym zostawił na np jakiś Cucumber - Korges 2020-05-25 19:13
A przeczytałeś w ogóle co on chce testować?... - Shalom 2020-05-25 19:59

Pozostało 580 znaków

2020-05-22 14:53

Rejestracja: 1 rok temu

Ostatnio: 14 minut temu

1

He, gdzieś już widziałem identyczny post ;) - https://www.facebook.com/grou[...]da/permalink/769319163604480/

Jak rozumiem dotarłeś tutaj po linkach. Ale miałeś je poczytać i wyciągnąć wnioski, bo odpowiedź na grupie była w miarę sensowna. Ty natomiast robisz copy paste pytania ;)

Przyłączam się do słów @Shalom. Lepiej uderzać pod swoje endpointy zwykłym klientem http, niż mockować wszystko co popadnie i tak naprawdę nie mieć pewności co testujesz.

bycza zagroda xdddd - Pinek 2020-05-22 15:10
Taki jest trend na fb. Streamerzy, czy inni celebryci internetowi zakładają takie grupki właśnie aby dawać tam jakieś info swoim 'fanom'. Zazwyczaj właśnie nazwa ma jakiś związek z nazwiskiem twórcy. Tak jak i w tym wypadku. Chyba nawet jest u nas na forum. @Przemysław Bykowski :) - kixe52 2020-05-22 15:13

Pozostało 580 znaków

2020-05-22 14:58

Rejestracja: 1 rok temu

Ostatnio: 2 godziny temu

0

Tzn. sprawa wyglada inaczej, chce tylko te cztery endpointy przetestować właśnie tym co robie dotychczas jako że jestem najmłodszy z teamu i mało doświadczony, zostałem poproszony o dokończenie właśnie w taki sposób jak jest już część przetestowana.Mój problem to głównie update, delete tego pliku bo atachment to plik, wszystko u nas jest stringiem(JSONem) i zrobiłbym to bo widze na podstawie innych kontrollerów ale tu jest jednak działanie z plikiem :(

edytowany 1x, ostatnio: Jan943, 2020-05-22 14:59
Wrzucasz kod firmowy do internetu? :O - kixe52 2020-05-22 15:01

Pozostało 580 znaków

2020-05-22 15:03

Rejestracja: 1 rok temu

Ostatnio: 2 godziny temu

0

Nie, to nie firmowy, jesteśmy teamem który pracuje po pracy , ja jeszcze student

Pozostało 580 znaków

2020-05-22 15:06

Rejestracja: 1 rok temu

Ostatnio: 14 minut temu

1

No dobrze, ale co chcesz testować? Ten kod z controllerów? Tego kodu nie powinno tam w ogóle być. Więc jeśli tak to przenieś go do innej warstwy i testuj jednostkowo.
Na końcu napisz testy integracyjne do controllerów.

Pozostało 580 znaków

2020-05-22 15:12

Rejestracja: 1 rok temu

Ostatnio: 2 godziny temu

0
@PutMapping(path = "/accident/{id}/attachment",    @GetMapping(path = "/accident/{id}/attachment" - jest przetestowane i mam just metode "@Test
    public void createAttachmentAndGetItTest() throws Exception", w AttachmentRestTemplate wykorzystałem:

 private void createMockFile(String endpoint) throws Exception {
        MockMultipartFile file = new MockMultipartFile("attachment",
                "filename.txt",
                "text/plain",
                MOCK_FILE_CONTENT.getBytes());

        mvc.perform(getMultiPartBuilder("PUT", endpoint).file(file)
                .header(HttpHeaders.AUTHORIZATION, authorizationBarer))
                .andExpect(status().isOk());
    }

dzięki klasie MockMultipartHttpServletRequestBuilder

i teraz chce podobnie zrobić update i delete

edytowany 1x, ostatnio: Shalom, 2020-05-22 15:29

Pozostało 580 znaków

2020-05-22 15:25
Moderator

Rejestracja: 16 lat temu

Ostatnio: 14 minut temu

1

@Jan943:

zostałem poproszony o dokończenie właśnie w taki sposób jak jest już część przetestowana

Brzmi to mniej wiecej jak:

  • Słuchajcie mam problem, mój rower z kwadratowymi kołami nie chce jeździć
  • Wymień to na okrągłe koła
  • Nie nie, bo już trochę się napracowałem z tymi kwadratowymi, więc nie chce ich zmieniać, chce tylko żeby jeździło

Logiki w kontrolerach w ogóle nie powinno być, a testy integracyjne stukające po endpointach powinny... stukać po endpointach a nie cudować z mockvc. Jeśli tak się uczycie z jakiegoś kursu, to sugeruje zmienić kurs.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 2x, ostatnio: Shalom, 2020-05-22 15:28
Sam napisał, że jest najmłodszy. Zmiana podejścia byłaby możliwa przez jakiegoś seniora, ale jego nie posłuchają - Pinek 2020-05-22 15:35

Pozostało 580 znaków

2020-05-22 15:28

Rejestracja: 1 rok temu

Ostatnio: 2 godziny temu

0

Poczekaj, czyli te tylko cztery oddzielne endpointy mam inaczej(tak jak sugerujesz) zrobić, tak?

Pozostało 580 znaków

2020-05-22 15:41
Moderator

Rejestracja: 16 lat temu

Ostatnio: 14 minut temu

1

Ja bym zaorał cały ten kod który pokazałeś:

  1. Logika w kontrolerach do zaorania
  2. Ten cały AttachmentRestTemplate do zaorania i do przerobienia na normalnego javowego klienta http do twojej aplikacji (czyli po prostu klasę/bibliotekę która pozwala stukać po endpointach twojej aplikacji z poziomu kodu javowego). Domyślam się że macie tych klas więcej - bez sensu. Czemu nie zrobić normalnego klienta tylko taką wieśniacką protezę z mockmvc? Taki klient i tak się przyda, jak jakiś inny serwis będzie chciał z tego korzystać.
  3. Testy które pokazałeś hmm np. czemu ten cleanup nie jest w Before/After tylko copypaste w testach? Nie podoba mi się też to before które tworzy jakiś stan aplikacji, bo przez to nie masz jak testować połowy use-case tego API. Np. co jak ktoś nie jest zalogowany? Before/After powinny resetować stan aplikacji i generalnie tyle. Stan aplikacji pod test, powinien być tworzony w konkretnym teście.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2020-05-22 15:42

Pozostało 580 znaków

2020-05-22 16:18

Rejestracja: 1 rok temu

Ostatnio: 2 godziny temu

0

Tak, dokłądnie, mamy wiecej klasy ".....RestTemplate", mamy też TestConstants czyli jsony recznie zrobione, Kontrollery i Security.Dziękuję bardzo za wskazówki.Mój plan jest taki żeby to dokończyć bo wydaje się niewiele i zaproponować kolegom inne zdrowsze podejscie.
Ogólnie to oni chyba skorzystali z https://stackoverflow.com/que[...]t-test-multipart-post-request ewidentnie :) :) A teraz jak zrobić obsłużyć ten PATCH I DELETE to cieżko, szczególnie że w patch nazwano metody getAdminAttachmentMetadata w którym mamy :

    String id;
    String filename;
    long length;
    LocalDateTime uploadDate;

więc mam po prostu nadpisywać zmienne?

Pozostało 580 znaków

Odpowiedz

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