Systemy informatyczne

Spring Boot #26 – Testy dla zwracanych obiektów z API

Spring Boot

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.

Tags:
Show Buttons
Hide Buttons