Integrasjonstesting med Spring Boot
Utfør integrasjonstester for REST-kontrollerne og datarepositoryene ved hjelp av `@SpringBootTest`.
Integrasjonstesting med Spring Boot er en gratis leksjon i Komplett guide til Spring Boot 4 på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Komplett guide til Spring Boot 4, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Komplett guide til Spring Boot 4 inneholder totalt 4 leksjoner.
Hva er integrasjonstesting?
Velkommen til integrasjonstesting med Spring Boot! Så langt har du lært om enhetstesting, som isolerer små deler av koden.
Integrasjonstester verifiserer derimot at ulike komponenter i applikasjonen fungerer riktig sammen. Dette involverer ofte flere lag, for eksempel webkontrolleren, tjenesten og til og med databasen.
- De tester «limet» mellom komponentene.
- De oppdager problemer som enhetstester kanskje ikke fanger opp.
- De gir større tillit til hvordan applikasjonen oppfører seg.
@SpringBootTest-annotasjonen
Grunnsteinen i integrasjonstesting i Spring Boot er annotasjonen @SpringBootTest.
Når du bruker @SpringBootTest, lastes hele Spring-applikasjonskonteksten. Det betyr at alle beans (komponenter), konfigurasjoner og egenskaper initialiseres, akkurat som når applikasjonen starter normalt.
Dette er kraftig, men også mer omfattende og tregere enn enhetstester fordi mer av applikasjonen startes.
Et enkelt tjenesteeksempel
La oss se for oss en enkel hilsenstjeneste som vi ønsker å teste. Denne tjenesten skal være en del av Spring Boot-applikasjonen vår.
Kjør denne koden for å se applikasjonskonteksten starte, selv om den ikke gjør så mye uten et endepunkt.
package com.coddykit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Service;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@Service
class GreetingService {
public String greet(String name) {
return "Hello, " + name + "!";
}
}Teste en tjeneste med @SpringBootTest
Slik skriver du en integrasjonstest for GreetingService. Legg merke til at vi bruker @Autowired direkte på tjenesten.
Når testen kjører, sørger @SpringBootTest for at bean-en GreetingService er tilgjengelig i testkonteksten.
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class GreetingServiceIT {
@Autowired
private GreetingService greetingService;
@Test
void contextLoads() {
assertThat(greetingService).isNotNull();
}
@Test
void greetReturnsCorrectMessage() {
String result = greetingService.greet("Coddy");
assertThat(result).isEqualTo("Hello, Coddy!");
}
}Teste web-laget med MockMvc
Når vi tester REST-kontrollere, ønsker vi ofte ikke å starte en full HTTP-server. Det er her MockMvc kommer inn.
MockMvc lar deg sende forespørsler til kontrollerne i et simulert miljø, uten behov for en faktisk kjørende server. Det er raskere og gir bedre kontroll.
- Bruk
@AutoConfigureMockMvcsammen med@SpringBootTest. - Injiser
MockMvcfor å sende forespørsler. - Kontroller status, innhold og headere.
En enkel REST-kontroller
La oss legge til en enkel REST-kontroller i applikasjonen vår. Denne kontrolleren bruker GreetingService.
Kjør denne koden for å starte applikasjonen med kontrolleren. Du kunne åpnet /api/greet?name=World i en nettleser hvis du hadde et komplett oppsett.
package com.coddykit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
@SpringBootApplication
public class WebApp {
public static void main(String[] args) {
SpringApplication.run(WebApp.class, args);
}
}
@RestController
class GreetingController {
private final GreetingService greetingService;
@Autowired
public GreetingController(GreetingService service) {
this.greetingService = service;
}
@GetMapping("/api/greet")
public String greetUser(@RequestParam String name) {
return greetingService.greet(name);
}
}
@Service
class GreetingService {
public String greet(String name) {
return "Hello, " + name + "!";
}
}Teste GET-forespørsler med MockMvc
Slik tester du GET-endepunktet til GreetingController ved hjelp av MockMvc. Vi simulerer en HTTP GET-forespørsel til /api/greet med en spørringsparameter.
Deretter kontrollerer vi at HTTP-statusen er OK (200), og at svarinnholdet samsvarer med forventningene våre.
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;
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
class GreetingControllerIT {
@Autowired
private MockMvc mockMvc;
@Test
void greetUserEndpointReturnsCorrectMessage() throws Exception {
mockMvc.perform(get("/api/greet?name=Coddy"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, Coddy!"));
}
}Teste POST-forespørsler
Testing av POST-forespørsler med MockMvc ligner, men innebærer at du angir HTTP-metoden og eventuelt en forespørselskropp. Du må ofte angi Content-Type-headeren.
Hvis du for eksempel hadde et endepunkt for å opprette en ny bruker, ville du sendt en JSON-nyttelast i forespørselskroppen.
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
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;
// Assuming a controller with @PostMapping("/api/users")
// and a method accepting @RequestBody User user
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerIT {
@Autowired
private MockMvc mockMvc;
@Test
void createUserEndpointReturnsCreatedStatus() throws Exception {
String newUserJson = "{\"name\":\"Jane Doe\", \"email\":\"jane@example.com\"}";
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content(newUserJson))
.andExpect(status().isCreated()); // Expect HTTP 201 Created
}
}Teste datarepoer
Når du tester datalaget (repoer), kan @SpringBootTest også brukes. Du kan bruke @Autowired direkte på repository-grensesnittene dine.
Det er vanlig å bruke en database i minnet, for eksempel H2, i disse testene for å sikre at de kjører raskt og ikke påvirker utviklingsdatabasen. @Transactional kan også sørge for at testene rydder opp etter seg.
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
// Example Entity (e.g., in src/main/java/com/coddykit/User.java)
// public class User { private Long id; private String name; /* getters/setters */ }
// Example Repository (e.g., in src/main/java/com/coddykit/UserRepository.java)
interface User {
Long getId();
void setId(Long id);
String getName();
void setName(String name);
}
@Repository
interface UserRepository extends CrudRepository<User, Long> {
User findByName(String name);
}
@SpringBootTest
@Transactional // Each test runs in a transaction and rolls back
class UserRepositoryIT {
@Autowired
private UserRepository userRepository;
@Test
void findByNameReturnsUser() {
// Create and save a user for the test
// (In a real scenario, User would be a JPA @Entity)
User user = new User() {
private Long id;
private String name;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
};
user.setName("TestUser");
userRepository.save(user);
User foundUser = userRepository.findByName("TestUser");
assertThat(foundUser).isNotNull();
assertThat(foundUser.getName()).isEqualTo("TestUser");
}
}Rask sjekk av @SpringBootTest
Du har lært hvordan @SpringBootTest hjelper med integrasjonstester. La oss se om du husker hovedfunksjonen.
Oppsummering: Integrasjonstesting
Flott jobbet! Du har utforsket integrasjonstesting i Spring Boot.
@SpringBootTestlaster hele applikasjonskonteksten for omfattende tester.MockMvclar deg simulere HTTP-forespørsler mot kontrollerne uten en kjørende server, noe som gjør tester av web-laget raskere og mer pålitelige.- Du kan teste tjeneste- og repository-lagene ved å autowire dem direkte inn i
@SpringBootTest-klasser, ofte med en database i minnet.
Integrasjonstester er avgjørende for å verifisere at alle delene av Spring Boot-applikasjonen fungerer godt sammen.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 21
- Leksjoner
- 84
Ofte stilte spørsmål
Er leksjonen «Integrasjonstesting med Spring Boot» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Komplett guide til Spring Boot 4, inkludert «Integrasjonstesting med Spring Boot», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Komplett guide til Spring Boot 4 inneholder totalt 4 leksjoner.
Hva lærer jeg i «Integrasjonstesting med Spring Boot»?
Utfør integrasjonstester for REST-kontrollerne og datarepositoryene ved hjelp av `@SpringBootTest`. Du øver på Komplett guide til Spring Boot 4 med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Komplett guide til Spring Boot 4?
Ingen tidligere erfaring er nødvendig. Komplett guide til Spring Boot 4 på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Integrasjonstesting med Spring Boot»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Komplett guide til Spring Boot 4-leksjonen?
Ja. Alle Komplett guide til Spring Boot 4-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Enhetstesting med JUnit og Mockito
- Integrasjonstesting med Spring Boot
- Slicetesting og TestContainers
- Test webkontrollere med MockMvc