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 |