Spring Boot vereinfacht das Erstellen stand-alone, produktionsreife Spring-Anwendungen erheblich und bietet gleichzeitig robuste Unterstützung für Testautomatisierung und -validierung. Das Testen ist ein integraler Bestandteil des Entwicklungsprozesses in Spring Boot, wobei das Framework umfangreiche Unterstützung für Unit- und Integrationstests durch eine Kombination aus Spring Test- und JUnit-Funktionalitäten bietet.
Spring Boot fördert das Prinzip der Testautomatisierung durch eine nahtlose Integration mit dem Spring Test Framework und JUnit. Es bietet vordefinierte Annotationen und Auto-Konfigurationen, die das Schreiben und Ausführen von Tests vereinfachen.
Um mit dem Testen in einer Spring Boot-Anwendung zu beginnen, sollten
Sie sicherstellen, dass die spring-boot-starter-test
Abhängigkeit in Ihrer pom.xml oder
build.gradle Datei enthalten ist. Diese
Starter-Abhängigkeit umfasst Spring Test, JUnit, Hamcrest, Mockito und
andere nützliche Bibliotheken.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>{spring-boot-version}</version>
<scope>test</scope>
</dependency>@SpringBootTest: Lädt den kompletten Anwendungskontext
für Integrationstests.@DataJpaTest, @WebMvcTest,
@WebFluxTest: Für spezifische Teile der Anwendung wie
JPA-Repositories, MVC-Controller oder reaktive Komponenten.@MockBean: Ermöglicht das Mocken von Beans im
ApplicationContext.@TestConfiguration: Definiert zusätzliche Beans oder
Konfigurationen nur für Testzwecke.Unit Tests fokussieren sich auf die kleinste Einheit des Codes, üblicherweise Methoden von Klassen. Sie sind schnell, isoliert und zeigen direkt, wo ein Problem liegen könnte.
@SpringBootTest
public class MyServiceTest {
@MockBean
private MyRepository myRepository;
@Autowired
private MyService myService;
@Test
void testMyServiceMethod() {
// Konfigurieren der Mocks
when(myRepository.findSomething()).thenReturn(new MyEntity());
// Ausführen der zu testenden Service-Methode
MyEntity result = myService.doSomething();
// Überprüfen, ob die Methode das erwartete Ergebnis liefert
assertNotNull(result);
}
}Integrationstests prüfen, wie verschiedene Teile der Anwendung zusammenarbeiten. In Spring Boot umfassen diese Tests oft den vollständigen Spring-Anwendungskontext oder Teile davon.
@WebMvcTest(MyController.class)
public class MyControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private MyService myService;
@Test
public void testMyController() throws Exception {
// Mock-Service-Konfiguration
when(myService.doSomething()).thenReturn("Expected Response");
// Ausführen einer HTTP GET-Anfrage und Überprüfen des Ergebnisses
mockMvc.perform(get("/my-path"))
.andExpect(status().isOk())
.andExpect(content().string(containsString("Expected Response")));
}
}Dieser Test verwendet @WebMvcTest für das Testen von
MVC-Controllern ohne den vollständigen ApplicationContext zu laden.
MockMvc wird verwendet, um HTTP-Anfragen zu simulieren und
das Ergebnis zu validieren.
Spring Boot vereinfacht das Testen von Datenzugriffsschichten, insbesondere JPA-Repositories, durch die Bereitstellung spezifischer Testannotationen und Datenbank-Konfigurationen.
@DataJpaTest
public class MyRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private MyRepository myRepository;
@Test
public void testFindBySomething() {
// Vorbereitung: Speichern eines Testobjekts
MyEntity myEntity = new MyEntity();
entityManager.persist(myEntity);
// Test: Suchen des Objekts über das Repository
List<MyEntity> found = myRepository.findBy
Something(myEntity.getSomething());
// Überprüfung: Das richtige Objekt wurde gefunden
assertThat(found).contains(myEntity);
}
}@DataJpaTest lädt nur die für JPA relevanten
Konfigurationen und Komponenten, was den Test fokussiert und performant
macht.