Fachlicher Vertrag: unverändert zu erhalten
- Tests prüfen Fachverhalten und nicht Implementierungsdetails.
- Lifecycle und Testdatenisolation bleiben korrekt.
- Fehlermeldungen sind aussagekräftig.
JUnit 4 und einzelne Beispielwerte wird nachvollziehbar in JUnit 5 Parameterized Tests überführt. Die Akte zeigt nicht nur das Ziel, sondern die tatsächlichen Dateien, APIs, Dependencies, Codebelege, Tests, Risiken und Cutover-Schritte.
| Dimension | Legacy | Modern | Migrationskonsequenz |
|---|---|---|---|
| Programmiermodell | imperativ / ohne Framework-Annotationen | explizite Java-Abstraktionen | Annotationen und Containerfunktionen werden nur dort eingesetzt, wo sie eine konkrete technische Verantwortung übernehmen. |
| Abhängigkeiten | 1 direkte Dependencies | 2 direkte Dependencies | 2 neu, 1 entfernt; Versionen und transitive Auswirkungen im erfolgreichen Online-Build prüfen. |
| Öffentliche API | 1 erkannte Methoden | 1 erkannte Methoden | Methoden werden nach fachlicher Rolle gemappt; reine Bootstrap- und Framework-Methoden sind kein fachlicher Vertrag. |
| Datenmodell | class VatCalculator | class VatCalculator | Feldnamen, IDs, Null-Semantik, Gleichheit und Serialisierungsform werden separat regressionstestet. |
| Fehlerverhalten | Legacy-Exceptions und Rückgabewerte | explizitere Fach-/Framework-Fehlerabbildung | Fehler dürfen nicht nur technisch übersetzt werden; Status, Ursache, Retrybarkeit und Client-Vertrag müssen erhalten oder versioniert werden. |
| Tests | Bestands- und Golden-Master-Tests | Unit-, Slice-, Contract- und Integrationstests | Der Modern-Pfad wird zuerst gegen denselben fachlichen Vektor geprüft und danach um neue technische Risiken ergänzt. |
| Betrieb | Legacy-Start/Lifecycle | modernes Packaging, Health und externe Konfiguration | CI-Mischbetrieb nur zeitlich begrenzt; keine still deaktivierten Tests. |
| Rollback | Legacy-Artefakt bleibt unverändert | Modern-Artefakt getrennt deploybar | Kein Rollback über Datenverlust: Schema, Nachrichten und verschlüsselte Daten müssen rückwärtslesbar oder durch Dual-Read abgesichert sein. |
test lifecycle and assertion migration
parameter boundaries, lifecycle and failure-message tests
Die Zuordnung ist semantisch: Eine Legacy-Klasse kann in mehrere moderne Rollen zerlegt werden.
| Legacy-Rolle / Datei | Modern-Rolle / Datei | Bedeutung |
|---|---|---|
| VatCalculator.java | VatCalculator.java | Produktionscode bleibt; Testdesign wechselt von JUnit 4 zu Jupiter/Parameterized Tests. |
| Datei | Typ | Annotationen | öffentliche API | Pattern | Zeilen |
|---|---|---|---|---|---|
| VatCalculator.java | class VatCalculator | — | double gross(double net, double rate) | Stateless Service – hält die Berechnung zustandsfrei und isoliert testbar. | 9 |
| Datei | Typ | Annotationen | öffentliche API | Pattern | Zeilen |
|---|---|---|---|---|---|
| VatCalculator.java | class VatCalculator | — | double gross(double net, double rate) | Stateless Service – hält die Berechnung zustandsfrei und isoliert testbar. | 9 |
| Status | Dependency | Version | Scope | Prüfung |
|---|---|---|---|---|
| ENTFERNT | junit:junit | 4.13.2 | test | Legacy-Laufzeit entfällt oder wird durch Plattform/BOM ersetzt. |
| NEU | org.junit.jupiter:junit-jupiter | BOM/Parent | test | Neue Laufzeit-/Testabhängigkeit; transitiv, lizenz- und security-seitig prüfen. |
| NEU | org.junit.jupiter:junit-jupiter-params | BOM/Parent | test | Neue Laufzeit-/Testabhängigkeit; transitiv, lizenz- und security-seitig prüfen. |
Die folgenden Ausschnitte stammen direkt aus den enthaltenen Projekten. Dadurch ist sichtbar, welche Verantwortung tatsächlich verschoben wurde.
Migrationsbedeutung: Produktionscode bleibt; Testdesign wechselt von JUnit 4 zu Jupiter/Parameterized Tests.
projects/19-junit-testing/legacy/src/main/java/at/aydin/lab/testing/legacy/VatCalculator.java
package at.aydin.lab.testing.legacy;
// Design Pattern: Stateless Service – hält die Berechnung zustandsfrei und isoliert testbar.
public final class VatCalculator {
public double gross(double net, double rate) {
if (net < 0 || rate < 0) throw new IllegalArgumentException();
return Math.round(net * (1 + rate) * 100.0) / 100.0;
}
}
projects/19-junit-testing/modern/src/main/java/at/aydin/lab/testing/modern/VatCalculator.java
package at.aydin.lab.testing.modern;
// Design Pattern: Stateless Service – hält die Berechnung zustandsfrei und isoliert testbar.
public final class VatCalculator {
public double gross(double net, double rate) {
if (net < 0 || rate < 0) throw new IllegalArgumentException();
return Math.round(net * (1 + rate) * 100.0) / 100.0;
}
}
--- VatCalculator.java
+++ VatCalculator.java
@@ -1,4 +1,4 @@
-package at.aydin.lab.testing.legacy;
+package at.aydin.lab.testing.modern;
// Design Pattern: Stateless Service – hält die Berechnung zustandsfrei und isoliert testbar.
public final class VatCalculator {
| ID | Ebene | Prüfung | erforderlicher Nachweis |
|---|---|---|---|
| 19-JUNIT-TESTING-A01 | Integration/Contract | Alle bisherigen Tests laufen unter Jupiter. | Automatisierter Test und CI-Protokoll |
| 19-JUNIT-TESTING-A02 | Integration/Contract | Keine versehentlich deaktivierten Tests. | Automatisierter Test und CI-Protokoll |
| 19-JUNIT-TESTING-A03 | Integration/Contract | Parameterized Tests decken Grenzwerte ab. | Automatisierter Test und CI-Protokoll |
| 19-JUNIT-TESTING-A04 | Integration/Contract | Tests sind unabhängig von Ausführungsreihenfolge. | Automatisierter Test und CI-Protokoll |
| 19-JUNIT-TESTING-A05 | Integration/Contract | Build enthält keine JUnit-4-Runtime mehr, sofern nicht bewusst benötigt. | Automatisierter Test und CI-Protokoll |
| 19-JUNIT-TESTING-T01 | Unit | Fachlogik ohne Container oder externen Dienst testen. | Unit-Test |
| 19-JUNIT-TESTING-T02 | Regression | Legacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen. | Vergleichsreport |
| 19-JUNIT-TESTING-T03 | Negative | Fehlerhafte, leere und grenzwertige Eingaben prüfen. | Negativtest |
| 19-JUNIT-TESTING-T04 | Operations | Start, Health, Shutdown und Konfigurationsfehler prüfen. | Deployment-/Startprotokoll |
| 19-JUNIT-TESTING-F01 | Fokus | parameter boundaries, lifecycle and failure-message tests | Modulspezifischer Testreport |
| Risiko | Auswirkung | Gegenmaßnahme | Gate |
|---|---|---|---|
| test lifecycle and assertion migration | NIEDRIG | parameter boundaries, lifecycle and failure-message tests | vor Cutover |
| Neue Framework-/Library-Laufzeitabhängigkeiten | MITTEL | SBOM, Lizenz-, CVE- und transitive Dependency-Prüfung im Online-Build | vor Release |
| Legacy-Verhalten war implizit an entfernte Library gekoppelt | MITTEL | Contract-/Golden-Master-Tests und gezielte Fehlerpfade | vor Abschaltung |
Keine zusätzlichen Ressourcen.
JUnit Vintage erlaubt zeitlich begrenzten Mischbetrieb; neue Tests werden ausschließlich mit Jupiter geschrieben.