W jaki sposób przetestować metodę przetwarzającą JSONy z zewnętrznego API ?

0

Cześć mam pewien problem, dotyczący pisania testów jednostkowych przy pomocy JUnit oraz Mockito. Napisałem program w Spring Boocie który pobiera dane z zewnętrznego API i w rezultacie otrzymuje jakiś JSON, jest w nim dużo niepotrzebnych rzeczy toteż przy użyciu biblioteki org.json wyciągam z niej tylko to co potrzebne:

    public JSONObject jsonFormatter(JSONObject obj){

        JSONObject resultJSON = new JSONObject();
        resultJSON.put("width", obj.getInt("width"));
        resultJSON.put("height", obj.getInt("height"));
        resultJSON.put("likes", obj.getJSONObject("score").getInt("likes"));

        // i tak dalej leci przetwarzanie JSONa
        return resultJSON;
    }

No i teraz chce napisać przypadki testowe i same testy dla tej metody. W jaki sposób należało by zamockować obiekt klasy JSONObject ( o ile faktycznie trzeba ) aby test nie testował zewnętrznego API tylko moją metodę która przetwarza JSONa ?

2

Możesz przecież ręcznie sobie zbudować takiego JSONa, przepchnąć go przez tę metodę i zobaczyć, czy zwraca poprawne rezultaty.

0

Ja bym to zrobił trochę na "dziko".
Stworzyłbym objekt JSONObject, dałbym mu odpowiednie propertisy i potem sprawdził czy są równe tym na wyjściu.

Nie ma tu w ogóle potrzeby robienia mocka wg mnie.

0

Jak czegoś nie potrafisz czegoś przetestować, to znaczy, że coś jest bardzo niedobrze.

Tu chyba nie do końca prawidłowy jest mechanizm mapowania json->java. IMO, powinieneś stworzyć proste DTO, w którym będziesz miał tylko te pola z JSONa, które potrzebujesz, a resztę pól zignorować. W dodatku org.json, to nie jest najlepszy wybór narzędzia, bo to jest niskopoziomowa biblioteka, która nie pozwala na automatyczne mapowania. Jak masz Springa, to użyj RESTTemplate https://spring.io/guides/gs/consuming-rest/

0
  1. Zrób DTO z polami które potrzebujesz
  2. Użyj Jacksona zeby poskładać takie DTO z przychodzącego jsona
  3. W teście tworzysz po prostu obiekt DTO z odpowiednimi danymi i jacksonem robisz z niego jsona do testu

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