Testen in Java: Überblick über wichtige Frameworks und Werkzeuge
Testen ist ein wesentlicher Bestandteil der professionellen Java-Entwicklung. Ohne qualitativ hochwertige Tests lassen sich die Stabilität des Codes, seine Sicherheit und die Einhaltung der Anforderungen nicht garantieren. In diesem Artikel betrachten wir die wichtigsten Werkzeuge und Frameworks zum Testen von Java-Anwendungen, die Ihnen helfen, zuverlässigen und wartbaren Code zu schreiben.
1. JUnit 5 – Fundament des Unit-Testens
JUnit 5 (Jupiter) ist der De-facto-Standard für Modultests in Java. Es bietet Annotationen, Assertions und Mechanismen zur Organisation von Tests.
Wichtige Funktionen:
- Annotationen
@Test,@BeforeEach,@AfterAllzur Steuerung des Testlebenszyklus - Parametrisierte Tests mit
@ParameterizedTest - Verschachtelte Tests (
@Nested) zur logischen Gruppierung - Erweiterungen (Extensions) über
@ExtendWith
Beispiel eines einfachen Tests mit JUnit 5:
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
@Test void testAddition() { Calculator calc = new Calculator(); int result = calc.add(2, 3); assertEquals(5, result, "2 + 3 sollte 5 ergeben"); }
@Test void testDivisionByZero() { Calculator calc = new Calculator(); assertThrows(ArithmeticException.class, () -> calc.divide(10, 0)); }}2. Mockito – Erstellung von Stubs und Mocks
Mockito ist das beliebteste Framework zur Erstellung von Mock-Objekten in Java. Es ermöglicht die Isolierung der zu testenden Klasse von ihren Abhängigkeiten.
Hauptfunktionen von Mockito:
- Erstellung von Mocks über
Mockito.mock() - Verhaltensdefinition mit
when()...thenReturn() - Verifikation von Methodenaufrufen (
verify()) - Erfassung von Argumenten über
ArgumentCaptor
import static org.mockito.Mockito.*;import org.junit.jupiter.api.Test;
class UserServiceTest {
@Test void testGetUser() { // Mock für das Repository erstellen UserRepository mockRepo = mock(UserRepository.class); when(mockRepo.findById(1L)).thenReturn(new User("Alice"));
// Mock in den Service einfügen UserService service = new UserService(mockRepo);
// Test ausführen User user = service.getUser(1L); assertEquals("Alice", user.getName());
// Prüfen, ob die Methode aufgerufen wurde verify(mockRepo).findById(1L); }}3. TestNG – Alternative zu JUnit mit erweiterten Funktionen
TestNG ist ein leistungsstarkes Framework, inspiriert von JUnit und NUnit. Es bietet zusätzliche Features: Testabhängigkeiten, parallele Ausführung, Testgruppen.
Besondere Merkmale von TestNG:
- Annotationen
@Test,@BeforeSuite,@AfterClass - Gruppierung von Tests über das Attribut
groups - Parametrisierung über XML-Konfiguration
- Abhängigkeiten zwischen Tests (
dependsOnMethods)
import org.testng.annotations.Test;import static org.testng.Assert.*;
public class MathTest {
@Test(groups = {"smoke", "math"}) public void testSum() { assertEquals(5, Math.addExact(2, 3)); }
@Test(dependsOnMethods = {"testSum"}) public void testMultiply() { assertEquals(6, Math.multiplyExact(2, 3)); }}4. Selenium WebDriver – Testen von Weboberflächen
Selenium ist ein unverzichtbares Werkzeug für das automatisierte Testen von Webanwendungen. Es unterstützt alle w