Systemy informatyczne

Spring Boot #25 – Testy MVC

Po napisaniu nowego API dobrą praktyką jest pokrycie go testami. Dodatkowo pokrycie testami API sprawi, że upewnimy się czy działa ono prawidłowo, w tym artkule pokażę Ci jak napisać testy, które sprawdzą poprawność działania API napisanego w Spring Boot.

Prosty przykład

Na potrzeby testu napiszmy metodę, która wyświetla napis hello:

@RestController
public class Api {

    @GetMapping("/hello")
    public String get() {
        return "hello";
    }
}

Teraz przygotujmy test dla niej. Należy utworzyć nową klasę testu, która będzie posiadała trzy adnotacje:

  • @RunWith(SpringRunner.class) – umożliwia na korzystanie z biblioteki JUnit
  • @SpringBootTest – dostarcza kontekst testowy Spring
  • @AutoConfigureMockMvc – pozwala na automatyczną konfiguracje MockMvc

 

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ApiTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void helloTest() throws Exception {
        mvc.perform(get("/hello")) 
                .andExpect(status().isOk())
                .andExpect(content().string("hello")); 
    }
}

W powyższym teście, w liniach:
11 – wskazywana jest metoda i endpoint, który ma zostać odpytany;
12 – wskazanie oczekiwanego statusu;
13 – wskazanie oczekiwanej odpowiedzi.

Rezultat testu:


MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /hello
       Parameters = {}
          Headers = []
             Body = null
    Session Attrs = {}

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"6"]
     Content type = text/plain;charset=UTF-8
             Body = hello 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

Expected :hello
Actual   :hello

Status   :OK

Test metody z parametrami

Zdarza się, że metoda ma parametry wejściowe, np.:

@GetMapping("/hello")
public String get(@RequestParam(required = false, defaultValue = "") String name) {
    return "hello " + name;
}

Wówczas do testu wystarczy dodać informacje o wchodzącym parametrze co widać w linii 3.

@Test
public void helloParamTest() throws Exception {
    mvc.perform(get("/hello").param("name", "Przemek"))
            .andExpect(status().isOk())
            .andExpect(content().string("hello Przemek"));
}

Co dalej?

W kolejnym artykule dowiesz się jak testować API, które zwraca obiekty.

Tags:
Show Buttons
Hide Buttons