Wpis z mikrobloga

Za zagłębiałem się za bardzo w kod, ale to new mi wygląda podejrzanie:

this.mockMvc = standaloneSetup(new UserController()).build();
Jak zrobisz new X() to wtedy Spring chyba nie da rady zrobić Autowire itp.
Zrób sobie zmienną w tej klasie od testów
@Autowired
private UserController userController;
i wtedy przekazuj ją do tego standaloneSetup
@NorthPL93: to już jakiś trop, wyskoczyło mi teraz

java.lang.AssertionError: No value at JSON path "$.login", exception: Expected to find an object with property ['login'] in path $ but found 'net.minidev.json.JSONArray'. This is not a json object according to the JsonProvider: 'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'.


dla linii pokazanej w komentarzu
http://wklej.to/qr9eK

już googluje

dałem normalne
jsonPath("$" zamiast $.login

i wypluło

java.lang.AssertionError: JSON path "$"

Expected: is "login1"

but: was <[{"id":1,"login":"login1","password":"password","email":"email","avatar":null}]>
@Roballo: Jestem trochę zielonka w tych sprawach, ale o ile rozumiem tuturial z neta to:
jak Twoje API zwraca ci tablicę to w tym

.andExpect(jsonPath("$.login", is("login1")))
chyba musisz wskazać o który element Ci chodzi
Przykład z netu:

.andExpect(jsonPath("$[0].description", is("Lorem ipsum")))
@NorthPL93: no dobra rzeczywiście to głupie już było z mojej strony, wczoraj próbowałem w ten sposób, ale że cały czas mi wyskakiwał błąd z NPE to go odrzuciłem. Dzięki Ci bardzo!

Swoją drogą masz może pomysł czemu spring nie łapie nowego obiektu w tym?

Jak zrobisz new X() to wtedy Spring chyba nie da rady zrobić Autowire itp.
@NorthPL93: czyli wszystko jak najbardziej jawnie i łopatologicznie, w sumie ma to sens. Dzięki raz jeszcze męczyłem się z tym od wczoraj i zapewne jeszcze by mi zeszło zanim bym znalazł ten fragment ( ͡° ʖ̯ ͡°)
@Roballo: Jak piszesz testy, to nie wolno Ci korzystać z adnotacji @Autowired. Testy nie tworzą beanów, a tylko nie można wstrzykiwać. Zamiast tego powinieneś użyć spy z mockito, a przy tym powinieneś mockować konkretne metody (oczywiście publiczne metody, bo tylko takie pozwala mockować mockito)
@Roballo: Generalnie dobrą praktyką jest aby rozdzielać serwisy od controllerów. Kod powinno się pisać w taki sposób, aby było go jak najłatwiej testować. Jeśli chodzi o używanie spy, to chodzi o to, że w momencie gdy zaciągniesz serwis przez @Autowired w testach, to będziesz operował na danych z bazy użytkowej. Zastosowanie spy (bez adnotacji, w konstruktorze UsersRepository usersRepository = Mockito.spy(UsersRepository.class);) zaciągnie tylko i wyłącznie interface, więc nie będzie działało na żadnych
@Leihto: aaa tak to wygląda. Wrzucę później cały ten projekt do review to zobaczymy gdzie na grzmociłem, a gdzie nie. Dzięki za wyjaśnienie, jestem w trakcie pisania to sobie wezmę do serca ;)