W poprzednim artykule opisałem, jak testować proste odpowiedzi z API. Zazwyczaj API zwraca rozbudowane obiekty.
Dlatego rozpatrzmy przypadek, w którym nasze API będzie zwracało tablice obiektów typu Person. Kod API jak poniżej:
@RestController public class Api { private List<Person> people; public Api() { people = new ArrayList<>(); people.add(new Person("Jan", "Nowak", Sex.MALE)); people.add(new Person("Tomasz", "Spust", Sex.MALE)); people.add(new Person("Karol", "Dzikus", Sex.MALE)); people.add(new Person("Joanna", "Niebywała", Sex.FEMALE)); people.add(new Person("Katarzyna", "Pospolita", Sex.FEMALE)); people.add(new Person("Anna", "Szybka", Sex.FEMALE)); } @GetMapping("/people/{limit}") public List<Person> getPeople(@PathVariable("limit") int limit) { return people.subList(0, limit); } }
public class Person { private String name; private String surname; private Sex sex; public Person(String name, String surname, Sex sex) { this.name = name; this.surname = surname; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public Sex getSex() { return sex; } public void setSex(Sex sex) { this.sex = sex; } }
public enum Sex { FEMALE, MALE }
Testowanie ilości zwracanych elementów
API zwraca określoną liczbę elementów, w zależności od wartości przekazanej do Path.
Toteż dobrze będzie wykonać test, który sprawdzi, czy rzeczywiście ilość zwracanych elementów odpowiada wartości przekazanej do Path. W metodzie andExpect dodajemy wyszukanie elementu na drzewie – w tym przykładzie elementu głównego (stanowiącego tablicę) co oznacza się znakiem $. Następnie porównujemy ich ilość.
@Test public void getPeopleWithLimit() throws Exception { mvc.perform(get("/people/{limit}", 4)) .andExpect(status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$", hasSize(4))); }
Dobrą praktyką również będzie dodanie warunków brzegowych – ale niech to już będzie Twoje zadanie domowe na podstawie tego co udało Ci się nauczyć 😊
Testowanie ilości zwracanych elementów
Jeśli zwracane elementy są stałe (tak jak w tym przypadku) to można również przetestować ich poprawność. W tym przypadku znowu odwołaj się do elementu na drzewie JSON i sprawdź czy wartość wskazywanego elementu jest taka jak zakładana.
@Test public void getPeopleWithSelectedItem() throws Exception { mvc.perform(get("/people/{limit}", 2)) .andExpect(status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$").isArray()) .andExpect(MockMvcResultMatchers.jsonPath("$.[0].name", Is.is("Jan"))) .andExpect(MockMvcResultMatchers.jsonPath("$.[0].surname", Is.is("Nowak"))) .andExpect(MockMvcResultMatchers.jsonPath("$.[0].sex", Is.is("MALE"))); }
Przechodzenie po strukturze JSON o poziomie złożoności tego przykładu nie stanowi żadnego problemu. Znacznie trudniej poruszać się po wielokrotnie zagnieżdżonej strukturze. Dlatego do skomplikowanych drzew polecam narzędzie – JSONPath Online Evaluator – https://jsonpath.com.