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.
Zobacz listę szkoleń


