Testauksen hallinta: JUnit, Mockito ja integraatiotestit · Oppitunti

RESTful-APIen testaaminen

Käyttäkää `MockMvc`- tai `WebTestClient`-työkalua kattavien integraatiotestien kirjoittamiseen Spring Boot -REST-ohjaimille.

Oppitunti 2/411 vaihetta

RESTful-APIen testaaminen on ilmainen Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Testauksen hallinta: JUnit, Mockito ja integraatiotestit-kurssilla on yhteensä 4 oppituntia.

Miksi REST-rajapintoja testataan?

RESTful-rajapinnat ovat monien nykyaikaisten sovellusten perusta. Niiden testaaminen on tärkeää, jotta voidaan varmistaa niiden toiminta odotetulla tavalla, erilaisten syötteiden käsittely ja oikeiden vastausten palauttaminen.

Tässä oppitunnissa keskitytään Spring Boot -REST-kontrollerien integraatiotestien kirjoittamiseen tehokkaiden työkalujen MockMvc ja WebTestClient avulla.

Spring Boot -testin valmistelu

Spring Boot -kontrollerien testaaminen vaatii erityisen valmistelun. @SpringBootTest-annotaatio lataa koko sovelluskontekstin, ja @AutoConfigureMockMvc määrittää MockMvc-olion puolestamme.

Tässä on testikontrolleriluokan perusrakenne:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

@SpringBootTest
@AutoConfigureMockMvc
public class MyApiControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void contextLoads() {
        // Your tests will go here
    }
}

Johdatus MockMvc:hen

MockMvc mahdollistaa Spring MVC -kontrollerien testaamisen käynnistämättä täyttä HTTP-palvelinta. Se simuloi HTTP-pyyntöjä ja -vastauksia, joten testit ovat nopeita ja eristettyjä.

Se sopii erityisen hyvin kontrollerikerroksen testaamiseen ja varmistaa, että reitit, pyyntöjen mappaukset ja vastausmuodot ovat oikein.

MockMvc: GET-pyyntöjen testaaminen

Testataan yksinkertaista GET-päätepistettä, esimerkiksi /api/hello-päätepistettä, joka palauttaa tekstin "Hello, CoddyKit!". Varmistamme HTTP-tilakoodin ja vastauksen sisällön.

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

// Assume a @RestController with @GetMapping("/api/hello") returning "Hello, CoddyKit!"
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testHelloEndpoint() throws Exception {
        mockMvc.perform(get("/api/hello"))
               .andExpect(status().isOk())
               .andExpect(content().string("Hello, CoddyKit!"));
    }
}

MockMvc: GET ja polkumuuttujat

Rajapinnoissa käytetään usein polkumuuttujia resurssien tunnistamiseen, esimerkiksi /api/users/{id}. MockMvc käsittelee niitä luontevasti.

Näin testaat päätepistettä, joka vastaanottaa tunnisteen:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

// Assume @GetMapping("/api/users/{id}") returns "User: " + id
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testGetUserById() throws Exception {
        mockMvc.perform(get("/api/users/{id}", 123))
               .andExpect(status().isOk())
               .andExpect(content().string("User: 123"));
    }
}

MockMvc: POST-pyyntöjen testaaminen

POST-pyyntöihin lähetetään yleensä pyyntörunko, usein JSON-muodossa. Sisältötyypin ja rungon voi määrittää MockMvc-olion avulla.

Testataan päätepistettä, joka luo kohteen:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

// Assume @PostMapping("/api/items") creates an item and returns it
@SpringBootTest
@AutoConfigureMockMvc
public class ItemControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testCreateItem() throws Exception {
        String newItemJson = "{\"name\":\"Laptop\", \"price\":1200}";
        mockMvc.perform(post("/api/items")
                       .contentType(MediaType.APPLICATION_JSON)
                       .content(newItemJson))
               .andExpect(status().isCreated())
               .andExpect(jsonPath("$.name").value("Laptop"));
    }
}

Johdatus WebTestClientiin

WebTestClient on ei-estävä, reaktiivinen asiakas web-sovellusten testaamiseen. Se kuuluu Spring WebFluxiin, mutta sitä voidaan käyttää myös Spring MVC -kontrollerien testaamiseen.

  • Sillä voi tehdä oikeita HTTP-kutsuja, jos se on määritetty käyttämään käynnissä olevaa palvelinta.
  • Se voidaan myös yhdistää MockMvc-olioon palvelimen puolella tapahtuvaa testausta varten samalla tavalla kuin MockMvc itse, mutta reaktiivisella rajapinnalla.

WebTestClient käytännössä

WebTestClient-olion käyttö muistuttaa MockMvc-olion käyttöä, mutta sen sujuva rajapinta vaikuttaa usein nykyaikaisemmalta, erityisesti reaktiivisissa sovelluksissa. Testataan /api/hello-päätepisteemme uudelleen.

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.web.reactive.server.WebTestClient;

// For WebTestClient with Spring MVC, we can use @SpringBootTest
// and inject WebTestClient.Builder to build it with MockMvc.webAppContextSetup
// For simplicity, this example assumes a WebFlux app or WebTestClient set up for MockMvc
// @SpringBootTest
// class HelloWebClientTest {
// @Autowired WebApplicationContext wac;
// WebTestClient client;
// @BeforeEach void setup() { client = WebTestClient.bindToApplicationContext(wac).build(); }
// ...

// For a simpler runnable example focusing on WebTestClient usage:
@WebFluxTest // This annotation sets up a minimal reactive context for WebTestClient
public class HelloWebClientTest {

    @Autowired
    private WebTestClient webTestClient;

    @Test
    void testHelloEndpoint() {
        webTestClient.get().uri("/api/hello")
                     .exchange()
                     .expectStatus().isOk()
                     .expectBody(String.class).isEqualTo("Hello, CoddyKit!");
    }
}

MockMvc vai WebTestClient

Milloin kannattaa käyttää MockMvc- ja milloin WebTestClient-oliota?

  • MockMvc: Sopii parhaiten perinteisiin Spring MVC -sovelluksiin. Se toimii palvelimen puolella, simuloi pyyntöjä eikä vaadi käynnissä olevaa palvelinta, joten se on nopea.
  • WebTestClient: Sopii ihanteellisesti reaktiivisiin Spring WebFlux -sovelluksiin. Se tarjoaa myös reaktiivisen asiakasrajapinnan Spring MVC -sovellusten testaamiseen, joten testien kirjoittaminen on nykyaikaisempaa ja sujuvampaa. Sillä voidaan jopa käyttää käynnissä olevaa palvelinta todellisiin päästä päähän -integraatiotesteihin.

Useimmissa Spring Boot -REST-rajapintojen integraatiotesteissä, joissa keskitytään kontrollerikerrokseen, MockMvc on nopeutensa ja suoran integraationsa ansiosta hyvä valinta.

Pikakysymys: rajapintojen testaustyökalut

Olette rakentamassa Spring Boot -sovellusta perinteisellä Spring MVC:llä. Haluatte kirjoittaa REST-kontrollereille nopeita ja eristettyjä integraatiotestejä käynnistämättä täyttä HTTP-palvelinta.

Kertaus ja seuraavat vaiheet

Tässä oppitunnissa opitte kirjoittamaan kattavia integraatiotestejä Spring Boot -REST-kontrollereille. Käsittelimme seuraavat aiheet:

  • testiympäristön määrittäminen @SpringBootTest- ja @AutoConfigureMockMvc-annotaatioilla
  • MockMvc-olion käyttäminen GET- ja POST-pyyntöjen simulointiin sekä tilan ja sisällön tarkistamiseen
  • WebTestClient-olion esittely reaktiivista testausta ja muita käyttötapauksia varten
  • MockMvc- ja WebTestClient-olioiden erot sekä tilanteet, joissa kumpaakin kannattaa käyttää

Nämä työkalut ovat olennaisia vankkojen ja luotettavien RESTful-rajapintojen rakentamisessa!

Aloita maksutta

Opi Testauksen hallinta: JUnit, Mockito ja integraatiotestit tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”RESTful-APIen testaaminen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppimispolun 3 oppituntia, myös oppitunnin “RESTful-APIen testaaminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Testauksen hallinta: JUnit, Mockito ja integraatiotestit-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”RESTful-APIen testaaminen”?

Käyttäkää `MockMvc`- tai `WebTestClient`-työkalua kattavien integraatiotestien kirjoittamiseen Spring Boot -REST-ohjaimille. Harjoittelet Testauksen hallinta: JUnit, Mockito ja integraatiotestit-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Testauksen hallinta: JUnit, Mockito ja integraatiotestit-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”RESTful-APIen testaaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppitunnilla?

Kyllä. Jokainen Testauksen hallinta: JUnit, Mockito ja integraatiotestit-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Spring Test Context Framework
  2. RESTful-APIen testaaminen
  3. Sulautetut tietokannat testeissä
  4. Web-kerrosten testaaminen @WebMvcTestillä ja MockMvc:llä
← Takaisin: Testauksen hallinta: JUnit, Mockito ja integraatiotestit