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

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ę :)

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.
1

He, gdzieś już widziałem identyczny post ;) - https://www.facebook.com/groups/byczazagroda/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.

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 :(

0

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

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.

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

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.

0

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

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.
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/questions/21800726/using-spring-mvc-test-to-unit-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?

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