Lab 12: Teststrategie - Tests auf allen Ebenen¶
In Lab 10 wurden bereits Domain-Unit-Tests (BrokerageProcessTest) und Web-Tests
(ViewingControllerTest) erstellt. In diesem Lab erweiterst du die bestehenden Tests
und fügst neue Testarten hinzu: Repository-Integrationstests, erweiterte ArchUnit-Regeln
und Tests für die in Lab 11 hinzugefügten Querschnittsthemen.
Aufgabe¶
Teil 1: Domain-Unit-Tests erweitern (kein Spring-Context!)¶
Erweitere die bestehende BrokerageProcessTest-Klasse um Tests für Geschäftsregeln,
die bisher nicht abgedeckt sind - reine JUnit-5-Tests:
- Negativtest:
setStatusToNotaryAppointment()wirft eineIllegalStateException, wenn kein angenommenes Angebot existiert - Happy Path: Angebot annehmen, dann Status auf NOTARTERMIN setzen - kein Fehler
- Angebot annehmen:
acceptOffer()setztacceptedauftrueund der Status ändert sich korrekt
// Ergänze in BrokerageProcessTest:
@Test
void test_setStatusToNotaryAppointment_withoutAcceptedOffer_throwsException() {
// Arrange: create a new BrokerageProcess
// Act & Assert: setStatusToNotaryAppointment() -> IllegalStateException
}
@Test
void test_setStatusToNotaryAppointment_withAcceptedOffer_succeeds() {
// Arrange: receive and accept an offer
// Act: setStatusToNotaryAppointment()
// Assert: status is NOTARY_APPOINTMENT
}
Wichtig: Kein @SpringBootTest, kein @ExtendWith(SpringExtension.class) - reine Unit-Tests!
Teil 2: Repository-Integrationstest¶
Erstelle einen @DataJpaTest für den BrokerageProcessRepositoryAdapter:
@DataJpaTest
@Import(BrokerageProcessRepositoryAdapter.class)
class BrokerageProcessRepositoryAdapterTest {
@Autowired
private BrokerageProcessRepositoryAdapter repository;
@Test
void test_saveAndFindById() {
// Save and load a BrokerageProcess
}
@Test
void test_viewingsArePersisted() {
// Save a BrokerageProcess with a Viewing
// Load and verify the Viewing is present
}
}
Hinweis: Falls du in Lab 11 JPA Auditing aktiviert hast (@EnableJpaAuditing),
muss die AuditorAwareConfig per @Import hinzugefügt werden oder ein
@MockitoBean AuditorAware<String> bereitgestellt werden.
Teil 3: Web-Tests für Querschnittsthemen erweitern¶
Die bestehende ViewingControllerTest-Klasse aus Lab 10 testet bereits die
Basis-Szenarien (201, 400, 404). Erweitere sie um Tests für die in Lab 11
hinzugefügten Exception-Handler:
// Ergänze in ViewingControllerTest:
@Test
void test_domainException_returns422() {
// Arrange: Use Case wirft DomainException
// Act: POST request
// Assert: 422 Unprocessable Entity
}
@Test
void test_optimisticLockException_returns409() {
// Arrange: Use Case wirft OptimisticLockException
// Act: POST request
// Assert: 409 Conflict
}
Teil 4: ArchUnit-Regel erweitern¶
Erweitere die bestehende ArchitectureTest-Klasse um eine neue Regel:
@ArchTest
static final ArchRule domain_events_should_be_records =
classes()
.that().resideInAPackage("..domain.event..")
.should().beAssignableTo(Record.class);
Neue Regel: "Domain Events müssen Records sein" - alle Klassen im Package ..domain.event.. müssen Records sein.
Bonus: Vollständiger Integrationstest¶
Erstelle einen @SpringBootTest-Integrationstest, der den vollständigen Ablauf überprüft:
- Erstelle einen BrokerageProcess
- Lege eine Besichtigung an (über den Use Case)
- Überprüfe, dass der Prozess mit seiner Besichtigung gespeichert wurde