Wpis z mikrobloga

Mam w swojej aplikacji trzy role i chciałbym przetestować czy zostanie zwrócony odpowiedni błąd jeśli użytkownik nie ma roli admina i próbuje strzelić na endpoint dla admina. W testach mam porobione metody np. sendRequestAsUser, która wyciąga użytkownika z rolą USER z bazy, generuje JWT i zwraca token jako String. Pierwsze co przyszło mi do głowy to napisanie testu sparametryzowanego żeby nie powtarzać kodu, ale tutaj pojawia się problem, bo do adnotacji MethodSource można przekazać tylko metody statyczne, a te moje statycznie nie są, bo korzystają z repo użytkownika żeby wyciągnąć go z bazy. Jak do tego podejść? Dodam jeszcze, że w tych testach używam WebTestClient'a.

#java #spring
  • 2
W gwoli jasności, to możliwe jest przekazanie niestatycznej metody do @MethodSource zmieniając cykl życia testu adnotacją - @TestInstance(PER_CLASS).

Możliwe, że twoją weryfikację da się zrealizować jeszcze łatwiej (bez bazy danych). Z MockMvc mogłoby to wyglądać w następujący sposób: mockMvc.perform(get(...).with(SecurityMockMvcRequestPostProcessors.user().roles(Role.ADMIN))
więc @MethodSource mógłby parametryzować Role albo cały RequestPostProcessor. Tutaj będzie zwykły Springowy User ale tych RequestPostProcessor jest sporo (są też związane z OAuth2).

Jeżeli chcesz WebTestClient to tam to się nazywa
@Smevios:

Ta adnotacja @TestInstance(PER_CLASS) może mi się przydać, dzięki.

Zrobiłem sobie sparametryzowany test z wykorzystaniem MockMvc i w sumie działa to okey. Są zwolennicy używania MockMvc, jak i są przeciwnicy. Ja jeszcze nie zagłębiałem się w problemy z używania tego.

mockMvc.perform(get("/api/v1/admin/users").with(user("test").roles(role)))
.andDo(print())
.andExpect(status().isUnauthorized());

Chcę jeszcze sprawdzić to drugie rozwiązanie z wykorzystaniem WebTestClient i rozumiem, że masz na myśli przekazywanie obiektu typu UserDetails do metody mockUser()?

webTestClient.mutateWith(mockUser().roles(role))
.get()
.uri("/api/v1/admin/users")
.exchange()