Testen in Java: Überblick über Frameworks und Tools
Qualitätssicherung ist ein wesentlicher Bestandteil der Java-Entwicklung. Moderne Frameworks ermöglichen die Automatisierung von Code-Überprüfungen, das frühzeitige Erkennen von Fehlern und die Sicherstellung der Anwendungsstabilität. In diesem Artikel betrachten wir die wichtigsten Werkzeuge für Unit-Tests, Mocking und Integrationstests in Java und geben praktische Beispiele für deren Verwendung.
1. JUnit 5 — Standard für Unit-Tests
JUnit 5 (Jupiter) ist das beliebteste Framework für modulare Tests in Java. Es bietet Annotationen zur Definition von Testmethoden, zur Verwaltung des Lebenszyklus und zur Parametrisierung.
Wichtige JUnit 5-Annotationen:
@Test— kennzeichnet eine Testmethode@BeforeEach/@AfterEach— werden vor/nach jedem Test ausgeführt@BeforeAll/@AfterAll— werden einmal für die gesamte Klasse ausgeführt@ParameterizedTest— für Tests mit verschiedenen Eingabedaten
Beispiel eines einfachen Tests:
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
@Test void testAddition() { Calculator calc = new Calculator(); assertEquals(5, calc.add(2, 3)); }
@Test void testDivisionByZero() { Calculator calc = new Calculator(); assertThrows(ArithmeticException.class, () -> calc.divide(10, 0)); }}2. TestNG — Alternative mit erweiterten Funktionen
TestNG (Test Next Generation) ist ein weiteres leistungsstarkes Framework, das von JUnit inspiriert wurde, aber zusätzliche Funktionen bietet: Testgruppierung, abhängige Tests, parallele Ausführung und flexible Konfigurationen über XML.
Besondere Merkmale von TestNG:
@Test(groups = {"smoke"})— Gruppierung von Tests@DataProvider— Übergabe von Daten an Tests@Test(dependsOnMethods = {"methodA"})— Abhängigkeiten zwischen Tests
Beispiel mit DataProvider:
import org.testng.annotations.DataProvider;import org.testng.annotations.Test;import static org.testng.Assert.assertEquals;
public class DataDrivenTest {
@DataProvider(name = "testData") public Object[][] createData() { return new Object[][] { { 1, 2, 3 }, { 5, -3, 2 }, { 0, 0, 0 } }; }
@Test(dataProvider = "testData") public void testAdd(int a, int b, int expected) { Calculator calc = new Calculator(); assertEquals(calc.add(a, b), expected); }}3. Mockito — Erstellung von Stubs (Mocks)
Mockito ist eine Bibliothek zur Erstellung von Mock-Objekten in Java. Sie ermöglicht es, die zu testende Komponente von ihren Abhängigkeiten (Datenbanken, externe Dienste) zu isolieren und die Interaktion zwischen Objekten zu überprüfen.
Wichtige Funktionen von Mockito:
mock()— Erstellung eines Mock-Objektswhen().thenReturn()— Festlegen des Verhaltensverify()— Überprüfung von Methodenaufrufen@Mockund@InjectMocks— automatische Einbindung von Mocks
Beispiel zur Verwendung von Mockito:
import static org.mockito.Mockito.*;import org.junit.jupiter.api.Test;
public class UserServiceTest {
@Test void testGetUser() { // Erstellen eines Mocks für das Repository UserRepository mockRepo = mock(UserRepository.class); when(mockRepo.findById(1L)).thenReturn(new User("Alice"));
UserService service = new UserService(mockRepo); User user = service.getUser(1L);
assertEquals("Alice", user.getName()); verify(mock