Potemkinsche Dörfer
Manchmal macht es Sinn komplexe Objekte durch Attrappen zu ersetzen. Nach aussen hin sehen diese Attrappen aus wie die echten, schweren Objekte, tatsächlich sind sie aber leicht und einfach.
Sehen wir uns das am Beispiel des automatischen Testens einer Managed Bean in einer Jakarta™EE-Anwendung an. Wenn wir hier gegen eine echte Datenbank testen würden, wäre der Aufwand hoch. Jeder einzelne Testfall müsste sich in der Datenbank einloggen, Testdaten einfügen, seine Tests durchführen, dabei vielleicht umfangreiche Lese- und Schreibtransaktionen absetzen und am Ende diese Daten wieder entfernen. Abgesehen vom Verwaltungsaufwand würden diese Tests hohe Durchlaufzeiten haben, was wir nicht wollen. Der zusätzliche Wert, den die Verwendung der Datenbank an dieser Stelle bringt ist relativ gering. Trotzdem: Wir wollen unsere Anwendung testen ohne sie zu dazu verändern zu müssen. Wir wollen das Original testen.
Dazu verwenden wir für die Tests einen Platzhalter für das Objekt, das für uns die Datenbankzugriffe erledigt. Dieser Platzhalter implementiert dasselbe Interface wie unser echtes Datenbank-Zugriffsobjekt, aber seine Umsetzung gleicht der eines Potemkinschen Dorfes.
Um das zu veranschaulichen demonstrieren wir das jetzt an dem DataAccessObject für unseren RESTeasy und Wildfly Beitrag. Dazu erstellen wir statt einer realen Datenbank eine Klasse, die die Objekte im Speicher anlegt1.
Das kann so aussehen:
Hierbei haben wir der Datenbank den @ApplicationScope gegeben, so dass die Daten während der gesamten Laufzeit der Anwendung erhalten bleiben.
Damit implementieren wir unser UserDao:2
Unser echtes UserDao würde zur Laufzeit einen EntityManager statt der InMemoryDatabase injiziert bekommen. Darauf geht das Tutorial über JPA genauer ein. User REST Service lässt sich damit aber schon fertig stellen.
-
speziell für Datenbank - Logik verwenden wir manchmal aber auch Testcontainer ↩
-
die lokale Variable ok in der update Funktion entspricht unserem Style Guide, der nur ein einziges return Statement pro Funktion unmittelbar vor der schliessenden Klammer fordert. ↩