TDD-Katalog: alle Use-Cases mit Commit-Historie

Diese Tabelle ist der zentrale Einstiegspunkt, um die TDD-Entwicklung eines beliebigen Use-Case in diesem Projekt nachzuvollziehen (siehe Commit-Historie als Lernpfad für die Vorgehensweise). Start-Commit ist der erste [RED]-Commit, End-Commit der letzte refactor:- oder [GREEN]-Commit der jeweiligen Einheit. Diese Tabelle wird laufend ergänzt, während neue Phasen (siehe Lernpfad) umgesetzt werden.

common-domain

Einheit Test-Datei Start-Commit End-Commit
Money (Erzeugung, Validierung, Addition) MoneyTest.java e63d924 82d72f9
AggregateRoot / DomainEvent AggregateRootTest.java a67a59a 1141813
EmailAddress EmailAddressTest.java b899edb 58bcaae
Money.subtract + Validierung zentralisiert (Refactor) MoneyTest.java a5ed5f0 685ca92
Money normalisiert auf waehrungsspezifische Nachkommastellen (Bugfix) MoneyTest.java 1c77a6a 339fc69

common-events

Einheit Test-Datei Start-Commit End-Commit
CustomerRegisteredEvent / IntegrationEvent CustomerRegisteredEventTest.java 0d7bcca 580d4ee
AuroraBankTopics AuroraBankTopicsTest.java 4ff852d 8302ccb
LoanApprovedEvent, LoanRejectedEvent, LOAN_EVENTS LoanDecisionEventsTest.java 89f80ce 2ece39b
TransferCompletedEvent, PAYMENT_EVENTS TransferCompletedEventTest.java 9e38821 b2a5f9e

common-web

Einheit Test-Datei Start-Commit End-Commit
GlobalExceptionHandler (422 + 404) GlobalExceptionHandlerTest.java 5e0b22e 7bb3b07
GlobalExceptionHandler generischer DomainException-Fallback GlobalExceptionHandlerTest.java d044792 aa0b430

customer-service (Phase 1) — abgeschlossen

Use-Case Test-Datei(en) Start-Commit End-Commit Techniken
Kunde registrieren CustomerTest, CustomerRegisteredTest, RegisterCustomerUseCaseTest, CustomerControllerTest, JpaCustomerRepositoryAdapterIT, KafkaIntegrationEventPublisherIT 65b6ae5 6f8a442 Inside-Out (Domain zuerst), TPP
Identität verifizieren/ablehnen CustomerVerificationTest, VerifyCustomerUseCaseTest, RejectCustomerUseCaseTest, CustomerVerificationControllerTest ef244b0 6da21a1 (Nachtrag fd127f1) Obvious Implementation
Risikoeinstufung RiskClassifierTest, CustomerRiskClassificationTest, ClassifyCustomerRiskUseCaseTest, CustomerRiskClassificationControllerTest b50f1b8 83db828 Fake It → Triangulation, Inside-Out (Application-Test ohne Mock des Domain-Service)
Kunde abfragen (GET /customers/{id}, ergänzt für accounts-service-Vertrag) GetCustomerUseCaseTest, CustomerDetailControllerTest 293f04d a6a14b7 Obvious Implementation
Nachtrag (Phase 7): Transactional Outbox statt Direkt-Publish OutboxEventTest, RegisterCustomerUseCaseTest (umgestellt), OutboxRelayTest, JpaOutboxEventRepositoryAdapterIT 1a3da9c c30ac2f Obvious Implementation (OutboxEvent), Outside-In (RegisterCustomerUseCase, OutboxRelay) - schließt eine per Code-Review gefundene Konsistenzlücke, siehe ADR-0007 Nachtrag Outbox
Nachtrag (Phase 7): RBAC für Risikoeinstufung JwtAuthoritiesConverterTest, CustomerRiskClassificationControllerTest (erweitert) e8405bc 918e1d2 Inside-Out (Converter), Outside-In (Controller) - siehe ADR-0007 Nachtrag RBAC

Echte, per Testlauf gefundene Bugs auf dem Weg: 6de6ec5 (KafkaContainer-Image-Kompatibilität) und c30ac2f (nackte new ObjectMapper() in Tests ohne JSR-310-Modul, siehe Teststrategie).

accounts-service (Phase 2) — abgeschlossen

Use-Case Test-Datei(en) Start-Commit End-Commit Techniken
IbanGenerator (ISO 7064 Mod-97-10) IbanGeneratorTest.java 79406cb 01f0d24 Obvious Implementation (Testorakel ISO 13616)
Konto eröffnen AccountTest (open), OpenAccountUseCaseTest, AccountControllerTest 20a9e29 c1c133c Outside-In (CustomerVerificationPort/AccountNumberGenerator gemockt, IbanGenerator echt)
Einzahlen / Abheben AccountTest (deposit/withdraw), DepositUseCaseTest, WithdrawUseCaseTest 5ffbcd2 010974c Inside-Out
Konto einfrieren/entsperren, schließen, Zinsen berechnen AccountTest (unfreeze/close/accrueInterest), AccountLifecycleUseCasesTest 8b5745c 3e0998e Inside-Out, gebündelte duenne Anwendungsfaelle (siehe Commit-Granularitaet)
REST-Endpunkte (alle sieben) AccountControllerTest.java 3a2869e 832bd47 Outside-In
Persistenz (Testcontainers) JpaAccountRepositoryAdapterIT.java, AccountTest (reconstitute) 4dd1573 bce4063 Inside-Out
RandomAccountNumberGenerator RandomAccountNumberGeneratorTest.java 827e082 a6b7673 Obvious Implementation
RestCustomerVerificationPort (Cross-Service-REST-Client) RestCustomerVerificationPortTest.java (MockRestServiceServer) 73bc379 cda0c88 Outside-In, HTTP-Adapter-Test ohne echten Server
Konto abfragen (GET /accounts/{iban}, ergänzt für cards-service-Vertrag) GetAccountUseCaseTest, AccountControllerTest ad333c1 ea65be3 Obvious Implementation

Echte, per Testlauf gefundene Bugs auf dem Weg: a5ed5f0/6ce9661/685ca92 (Money-Validierung umgehbar, vor subtract() entdeckt) und 1c77a6a/339fc69 (BigDecimal-Skalierungsmismatch nach Multiplikation in accrueInterest) - siehe Teststrategie.

cards-service (Phase 3) — abgeschlossen

Use-Case Test-Datei(en) Start-Commit End-Commit Techniken
Karte ausstellen CardTest (issue), PanGeneratorTest, IssueCardUseCaseTest 5dd7023 9943b6a Outside-In (AccountVerificationPort/CardRepository gemockt, PanGenerator echt)
Karte aktivieren, sperren/entsperren CardTest (activate/block/unblock), CardLifecycleUseCasesTest fd644ff 80630d4 Obvious Implementation
Autorisierungsanfrage prüfen (Tageslimit) CardAuthorizationTest.java, AuthorizeTransactionUseCase (Teil von CardLifecycleUseCasesTest) c94764f 9092edc Triangulation ueber fuenf Faelle (Status-, Limit-, Kumulierungs-, Tageswechsel-Regel)
REST-Endpunkte (alle fuenf) CardControllerTest.java 21baf8b 99693d1 Outside-In
Persistenz (Testcontainers) JpaCardRepositoryAdapterIT.java, CardTest (reconstitute) 4ca1ec8 26d7a67 Inside-Out
RestAccountVerificationPort (Cross-Service-REST-Client) RestAccountVerificationPortTest.java (MockRestServiceServer) fb615a3 c7d5489 Outside-In, HTTP-Adapter-Test ohne echten Server

Namenskollision entdeckt und behoben: AuthorizationDecision.approved()/declined(...) kollidierten mit den record-eigenen Accessor-Methoden - umbenannt zu approve()/decline(...) (Teil von 9092edc).

payments-service (Phase 4) — abgeschlossen

Use-Case Test-Datei(en) Start-Commit End-Commit Techniken
Transfer-Aggregate (initiate, complete/fail/compensate) TransferTest.java dd7c105 77df036 Inside-Out
Doppelte Buchführung (LedgerBooking) LedgerBookingTest.java 8609a83 663182d Inside-Out, Invariante "Debit==Credit" strukturell statt nachtraeglich geprueft
Überweisung anstoßen (Saga mit Kompensation) InitiateTransferUseCaseTest.java b7d7c9a 4b20683 Outside-In / London-Schule - alle drei Saga-Ausgaenge (Erfolg, frueher Abbruch, Kompensation) per gemocktem AccountMovementPort erzwungen, siehe ADR-0005
Zahlungsstatus abfragen GetTransferStatusUseCaseTest.java 46e676b 054ccce Obvious Implementation
REST-Endpunkte TransferControllerTest.java 12a607f ce80a69 Outside-In
Persistenz (Testcontainers, Transfer + LedgerEntry) JpaTransferRepositoryAdapterIT.java, TransferTest (reconstitute) 7d7c081 0c0b0ad Inside-Out
RestAccountMovementPort (Cross-Service-REST-Client zu accounts-service) RestAccountMovementPortTest.java (MockRestServiceServer) dbe4f34 3c0b80b Outside-In, HTTP-Adapter-Test ohne echten Server
Nachtrag (Phase 6): TransferCompletedEvent veroeffentlichen InitiateTransferUseCaseTest.java (erweitert) 55a867d 5e6be56 Outside-In - Phase 4 war rein REST-basiert, notification-service (Phase 6) brauchte ein Integrationsevent; rueckwirkend ergaenzt wie zuvor die GET-Endpunkte in customer-/accounts-service

lending-service (Phase 5) — abgeschlossen

Use-Case Test-Datei(en) Start-Commit End-Commit Techniken
LoanApplication-Aggregate (submit, Statusuebergaenge) LoanApplicationTest.java fa8fe96 611545f Inside-Out
Kreditwürdigkeit prüfen (Scoring) CreditScorerTest.java a8c2a4b 4d4d357 (parametrisiert: 2af56e2) Triangulation ueber fuenf Schuldendienst-Faelle, anschliessend per Refactor zu @ParameterizedTest verdichtet ("Beispielbasiert → Parametrisierter Test")
Tilgungsplan erzeugen RepaymentScheduleGeneratorTest.java 39e9c32 cebc989 Triangulation (Rundungsdifferenz-Grenzfall)
LoanApprovedEvent/LoanRejectedEvent (common-events) LoanDecisionEventsTest.java 89f80ce 2ece39b Obvious Implementation
Kreditantrag stellen, Scoring-Vorschau, Tilgungsplan abrufen, Entscheidung finalisieren ApplyForLoanUseCaseTest, ScoreCreditApplicationUseCaseTest, GenerateRepaymentScheduleUseCaseTest, FinalizeLoanDecisionUseCaseTest 5487bcf 8645f90 Obvious Implementation (Antrag stellen), Inside-Out (Scoring-Vorschau), Outside-In/London-Schule (Entscheidung finalisieren, alle drei Ausgaenge per gemocktem Repository/Publisher erzwungen, analog InitiateTransferUseCase)
Kreditantrag abfragen + REST-Endpunkte (alle fuenf) GetLoanApplicationUseCaseTest, LoanApplicationControllerTest 681074d 25973e9 Obvious Implementation, Outside-In (Controller)
Persistenz (Testcontainers) JpaLoanApplicationRepositoryAdapterIT.java 0472974 e616c3b Inside-Out

Echter, per Testlauf gefundener Fehler auf dem Weg - diesmal im Test selbst statt in der Produktion: 0acf7bc (vier Anwendungsfall-Tests initialisierten das gemockte Repository als Feld statt in @BeforeEach, siehe Teststrategie).

notification-service (Phase 6) — abgeschlossen

notification-service ist ein reiner Event-Konsument: keine schreibenden REST-Endpunkte, jede Notification entsteht ausschliesslich als Reaktion auf ein Kafka-Event aus einem anderen Service.

Use-Case Test-Datei(en) Start-Commit End-Commit Techniken
Notification-Aggregate (Erzeugung mit Zeitstempel) NotificationTest.java e1123ba 065fcd2 Obvious Implementation (Clock.fixed statt Instant.now() im Test)
Reaktion auf CustomerRegistered, LoanApproved/LoanRejected, TransferCompleted HandleCustomerRegisteredUseCaseTest, HandleLoanDecisionUseCaseTest, HandleTransferCompletedUseCaseTest 279604b 2062003 Inside-Out (Notification-Aggregate real, nur Repository gemockt)
Kafka-Listener (Weiterleitung an Anwendungsfaelle) CustomerEventsListenerTest, LoanEventsListenerTest, PaymentEventsListenerTest 3839c60 b9fb078 Outside-In, Adapter-Test ohne echten Broker (analog REST-Client-Tests in accounts-/cards-service) - LoanEventsListener nutzt einen @KafkaListener mit zwei @KafkaHandler-Methoden auf demselben Topic
Persistenz (Testcontainers) JpaNotificationRepositoryAdapterIT.java 8e4961d f90f865 Inside-Out
Benachrichtigungen abfragen (Verifikations-Endpunkte) GetNotificationUseCaseTest, ListNotificationsForRecipientUseCaseTest, NotificationControllerTest 2417435 f49bd05 Obvious Implementation, Outside-In (Controller)

Bewusste Lernprojekt-Vereinfachung: HandleTransferCompletedUseCase loest die Ziel-IBAN nicht per Cross-Service-Aufruf zu einer Kunden-Id auf, sondern verwendet sie direkt als Empfaenger-Referenz (siehe Kommentar in HandleTransferCompletedUseCase.java).

Phase 7 — Härtung & Abschluss

Einheit Test-Datei(en) Start-Commit End-Commit Techniken
ResourceServerSecurityConfig (JWT-Pflicht + Permit-Liste) ResourceServerSecurityConfigTest.java 02d4772 74748b5 Obvious Implementation - zwei der drei Assertions waren bereits gruen, bevor der Code existierte (Spring-Boot-Default), siehe ADR-0007
customer-service per common-security abgesichert CustomerControllerSecurityTest.java (neu), vier bestehende @WebMvcTest-Klassen (retrofittet) 61c3bdd 71be8a2 Outside-In - echtes RED (403 statt 401 in zwei Zwischenschritten, siehe ADR-0007) vor dem finalen GREEN

Zwei echte, per Testlauf gefundene Spring-Security-Stolpersteine auf dem Weg (beide in ADR-0007 ausführlich dokumentiert): (1) anonyme Anfragen erhalten ohne .anonymous(...).disable() 403 statt 401 (AccessDeniedException statt AuthenticationException); (2) @WebMvcTest-Slices übernehmen eine fremde SecurityFilterChain-Bean weder als @Configuration noch als @AutoConfiguration zuverlässig automatisch - ein expliziter @Import(ResourceServerSecurityConfig.class) je Testklasse war nötig.

| common-security-Rollout auf die übrigen fünf Services | je ein neuer *ControllerSecurityTest.java | 3406f15 (RED) | ef5efe5 (GREEN) | Outside-In, mechanische Wiederholung des in customer-service etablierten Musters (siehe ADR-0007, Nachtrag) | | RBAC: JwtAuthoritiesConverter + @PreAuthorize für Risikoeinstufung | JwtAuthoritiesConverterTest.java, CustomerRiskClassificationControllerTest.java (erweitert) | e8405bc | 918e1d2 | Inside-Out (Converter), Outside-In (Controller-Rollenpruefung) - siehe ADR-0007, Nachtrag RBAC |

architecture-tests (fortlaufend)

Regel Test-Datei Commit
common-domain frei von Spring/Jakarta/Hibernate CommonDomainPurityTest.java a8377b0
⌂ Cockpit