Rolle im AblaufPrüft Routing, Shadow-Vergleich, Feature-Toggles und Parity-Berichte.
Damit ist der zentrale Pfad abgeschlossen; der Test-/Runner-Code und die vollständige Dateiliste darunter zeigen die übrigen Varianten.
package com.example.enterprise.run7c;
public final class Run7CTestRunner {
public static void main(String[] args) {
shouldKeepParityInShadowMode();
shouldRejectBlockedCustomerInBothPaths();
shouldRouteToNewPathWhenEnabled();
System.out.println("RUN7C_TESTS_OK");
}
private static void shouldKeepParityInShadowMode() {
TestFixture fixture = TestFixture.create();
fixture.toggles.setDefaultMode(ProcessingMode.SHADOW);
OrderResult result = fixture.router.process(TestData.standardOrder("REQ-SHADOW"));
assertTrue(result.accepted(), "legacy result should be accepted");
assertEquals(1, fixture.reporter.events().size(), "shadow parity event expected");
assertTrue(fixture.reporter.events().get(0).match(), "legacy and modern should match");
}
private static void shouldRejectBlockedCustomerInBothPaths() {
TestFixture fixture = TestFixture.create();
fixture.toggles.setDefaultMode(ProcessingMode.SHADOW);
OrderResult result = fixture.router.process(TestData.blockedOrder());
assertEquals(OrderDecision.REJECTED, result.decision(), "blocked customer rejected");
assertTrue(fixture.reporter.events().get(0).match(), "blocked customer parity");
}
private static void shouldRouteToNewPathWhenEnabled() {
TestFixture fixture = TestFixture.create();
fixture.toggles.setDefaultMode(ProcessingMode.NEW);
OrderResult result = fixture.router.process(TestData.standardOrder("REQ-NEW"));
assertTrue(result.accepted(), "new path accepted");
assertEquals(0, fixture.reporter.events().size(), "new mode does not shadow compare");
}
private static void assertTrue(boolean condition, String message) { if (!condition) throw new AssertionError(message); }
private static void assertEquals(Object expected, Object actual, String message) { if (!java.util.Objects.equals(expected, actual)) throw new AssertionError(message + " expected=" + expected + " actual=" + actual); }
private record TestFixture(RefactoringRouter router, InMemoryFeatureToggleService toggles, ParityReporter reporter) {
static TestFixture create() {
InMemoryOutbox outbox = new InMemoryOutbox();
InMemoryOrderRepository repository = new InMemoryOrderRepository();
PaymentPort payment = new FakePaymentAdapter();
LegacyOrderProcessor legacy = new LegacyOrderProcessor(payment, repository, outbox);
RefactoredOrderProcessor modern = new RefactoredOrderProcessor(new ValidationService(), new PricingService(), new TaxService(), new ShippingService(), payment, repository, outbox);
InMemoryFeatureToggleService toggles = new InMemoryFeatureToggleService();
ParityReporter reporter = new ParityReporter();
return new TestFixture(new RefactoringRouter(legacy, modern, toggles, reporter), toggles, reporter);
}
}
}