Po aktualizacji springa wysypują się testy

0

Na początku zaznaczę, że jestem bardzo świeży w tej materii. Zaktualizowałem spring boota do wersji 1.5.22.RELEASE. i po tej operacji przestały działać testy. W kodzie testu jest coś takiego:

private ResultActions checkResultEricsson(final ResultActions resultActions, String prefix) throws Exception {
   prefix = "$.root[?(@.object.vendor.name == 'Ericsson')]";

   resultActions
         .andExpect(jsonPath("$..editStatusName", everyItem(equalTo("NONE"))))
         .andExpect(jsonPath(prefix + "[*].object.additionalParamsList", everyItem(equalTo(null))))
         .andExpect(jsonPath(prefix + "[*].object[?(@.username == 'sb')].password").value("sbspass");  <- tu się wysypuje
}

Zauważyłem, że filtrowanie jsonPath czasami nie działa. W jaki sposób mogę zapisać do logów rezultat działania metody jsonPath(...). Jeśli będę wiedział jakie daje wyniki, to będę mógł stworzyć odpowiedni skrypt. Szukałem w sieci rozwiązania tego problemu ale nic nie znalazłem.

Dziękuję za wszelkie sugestie

3

Gratuluje podbicia do wersji, która ma tylko 2 lata i nie jest supportowana.
tu się wysypuje to nie jest opis błędu.

Napisz jak się wysypuje. Co widzisz?

0

Odpuść mi proszę kąśliwości. Projekt jest dosyć stary. Przyczyną aktualizacji była dziura bezpieczeństwa w tomcacie. Wersja springa, którą zastosowałem wymagała najmniejszych zmian w kodzie. Z wyższa wersją projekt "wariuje", wymaga wielu zmian i zapewne bym sobie z nimi nie poradził.

W wyniku wykonania metody jsonPath z poniższego wiersza

.andExpect(jsonPath(prefix + "[*].object[?(@.username == 'sb')].password").value("sbspass");  <- tu się wysypuje

generowany jest wyjątek przez matcher:

java.lang.AssertionError: No matching value at JSON path "$.accAccessOSSs[?(@.object.vendor.name == 'Ericsson')][*].object[?(@.username == 'sb')].password"

W starszej wersji spring boot (1.2.3.RELEASE) skrypt działa poprawnie i test przechodzi. Wrzuciłem dane i skrypt do toola online (jsonpath.com) i również nie zwraca spodziewanych wyników. Skrypt, który stworzyłem w toolu i zwraca spodziewany wynik też nie działa w metodzie jsonPath. Już nie mam więcej pomysłów jak się za to zabrać.

Powtórzę pytanie: czy istnieje sposób aby podejrzeć wyniki filtrowania danych przez metodę jsonPath?

1

jsonPath to niestety matcher - raczej się nie da tego wygodnie podejrzeć.
Ale dokładnie dobrze robisz - skoro jsonpath w zewnętrznym narzędziu też nie działa, to pewnie jest błędny. Może jsonPath był zrypany w starszej wersji springa.
IMO trzeba te query poprawić (ale nie znając jsona nie wiem na jakie).

0

Znalazłem jeszcze jedno narzędzie (jsonpath.herokuapp.com) i zwraca inne wyniki od jsonpath.com dla tych samych danych.

2

jsonPath to masakra (jak przestaje działać), lepiej zdeserializować response na jakiś obiekt javowy i normalnie sprawdzać getami. Jak masz dużo pól, to zawsze można użyć na coś JsonNode.

1

Jaką wersję json-patha masz? Mieliśmy ostatnio podobny problem po podbiciu springowych bibliotek i po dłuższej inwestygacji wyszło ze w którejś z libek była wersja json-patha z bugiem. Pomogło dorzucenie do projektu najnowszej wersji json-patha.

3

Sprawdź sobie czy w tzw. międzyczasie nie został wprowadzony ficzur do jsonPath matchera, który np. wprowadza rozpoznawanie wielkości liter w kluczach jsona.
W starej wersji mogłoby działać, a w nowej może jest już case sensitive.

Ślepy strzał to dodanie application properties: spring.jackson.mapper.accept-case-insensitive-properties=true, ślepy więc jak nie działa, to trudno ;)

0

@bolson: Załadowała się wersja 2.2.0.

0

W jaki sposób mogę zapisać do logów rezultat działania metody jsonPath

Takie problemy rozwiązuje się w taki sposób, że patrzysz jakie exception leci a następnie zapinasz się debugerem w miejscu gdzie jest rzucane - w kodzie frameworka jeśli trzeba. Patrzysz co powoduje rzucanie exceptiona i wędrujesz w górę stacka żeby dowiedzieć się skąd się to wzięło (w Twoim przypadku jaki JSON dostajesz). W debugerze możesz wykonać na przechwyconych danych query jsonpath i próbować je naprawić / zmienić.

2

Ja bym jednak mocno sugerował zmapować odpowiedź na jakieś DTO i sprawdzać po ludzku te pola, bo takie matchowanie na kolanie zawsze będzie powodować jakieś problemy

0

Ogólnie poradziłem sobie z podstawowym problemem i udało mi się dotrzeć do wyników filtrowania danych. Napotkałem jednak problem przy weryfikacji wyników. Jest taki fragment kodu:

resultActions.andExpect(jsonPath(prefix, equalTo(null)));

Generuje on wyjątek:
java.lang.AssertionError: JSON path "$.accAccessOSSs[?(@.object.vendor.name == 'ZTE')][?(@.object.name == 'OSS_Z1')].object.accNEsUnderOSS[?(@.name == 'BSC4')].additionalParamsList"
Expected: null
but: was <[null]>

Gdy zmieniłem parametr dla equalTo:

resultActions.andExpect(jsonPath(prefix, equalTo(nullValue())));

to wygenerowany został wyjątek:
java.lang.AssertionError: JSON path "$.accAccessOSSs[?(@.object.vendor.name == 'ZTE')][?(@.object.name == 'OSS_Z1')].object.accNEsUnderOSS[?(@.name == 'BSC4')].additionalParamsList"
Expected: <null>
but: was <[null]>

Który matcher powinienem zastosować aby poprawnie zweryfikował wynik?

0

Już sobie poradziłem. Dziękuję za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.