Das Synchronisationsproblem tritt auf, wenn Teststrategien besprochen werden. Grundsätzlich - wegen der zusätzlichen Last, die Mokas für Entwickler verursachen, und auch wegen des Risikos, dass Mooks von den tatsächlichen Abhängigkeiten abweichen.
Inwiefern ist es billiger für uns, die Synchronisation von Mokas mit realen Implementierungen sicherzustellen?
Zur Synchronisation können wir einen Test schreiben, der die gleichen Prüfungen gegen mok und reale Implementierung durchführt.
Es sieht ungefähr so aus (ich schreibe ohne DI, aber mit DI ist es einfacher und korrekter):
public abstract class AbstractValidOrderDaoTest(){ Dao dao; public abstract arrange(); @Test public void whenValidOrderInDb_thenReturnValidOrder(){ arrange(); Order order = dao.retrieve(); assertNotNull(order); assertNotNull(order.getCustomerName());
OrderDaoTest arbeitet gegen ein reales Objekt mit einem zugrunde liegenden Mock oder einer realen Abhängigkeit, und ValidOrderDaoTest arbeitet gegen einen Mock.
Wenn es sich bei ValidOrderDataSource um eine echte Datenbank handelt, befindet sich OrderDaoTest in einem separaten Paket und wird im Rahmen von Integrationstests ausgeführt, die beispielsweise beim Aktualisieren der Datenbank von Zeit zu Zeit abstürzen können. Dies sollte CI \ CD nicht beeinträchtigen.
Wenn es sich bei ValidOrderDataSource um eine Scheindatenbank handelt, wird OrderDaoTest zusammen mit den übrigen Komponententests ausgeführt.
Da bei der Mock-Synchronisation eine echte Klasse getestet wird, z
Die eigentliche Klasse muss ihre zugrunde liegenden Abhängigkeiten auseinandersetzen. Darüber hinaus sollte sich die zugrunde liegende Mok-Sucht entsprechend dem Szenario der darüber liegenden Mok verhalten. In unserem Fall das
ValidOrderDataSource.
Wenn Sie darüber nachdenken, ist es sinnvoll - jede Aussage über das Verhalten höherer Klassen impliziert implizit ein Szenario in den zugrunde liegenden. Wenn der Controller etwas vom Dienst zurückgibt, wäre es schön, wenn die Basis dies bereitstellen könnte.
Umgekehrt leben höhere Klassen oft mit unrealistischen Vorstellungen über niedrigere Klassen. Es ist also nicht schlecht, unnötige Skripte zu entfernen.
Die Rekursion schlägt vor, dass Sie zum Synchronisieren des Top-Level-Mocks die Synchronisierung aller zugrunde liegenden Mocks bis zu externen Abhängigkeiten starten müssen.
Dies macht die Systemspezifikation noch transparenter, da allgemeinere und abstraktere Szenarien auf privateren basieren.
Beachten Sie auch, dass es Mokas gibt, die nicht synchronisiert werden müssen. Das heißt Wir haben keine wirkliche Implementierung, die einem Cross-Test unterzogen werden müsste. Dies gilt für schwerwiegende Fehlerszenarien. EmptyResultException_Datasource, z. Dies reduziert die Anzahl der erforderlichen Kreuztests erheblich.
Die Synchronisierung ist sicherlich für echte externe Abhängigkeiten wie Warteschlangen, externe Services und Datenbanken erforderlich - insbesondere im Hinblick auf die Daten, die sie aufnehmen und zurückgeben.
Wenn sich der externe Dienst plötzlich ändert, was häufig in der Entwicklungsphase ist, können wir sein Verhalten nicht überprüfen, wenn wir keinen Synchronisationstest schreiben.
In Bezug auf die Arbeitsintensität. An sich haben wir bereits einen echten Klassentest mit einigen willkürlichen Scheinabhängigkeiten. Im Vergleich zu nicht synchronisierten Tests müssen wir einige Dinge tun.
- markieren Sie handeln und behaupten Sie in einem abstrakten Test
- Machen Sie einen speziellen Test für Moka
- Beheben Sie Scheinabhängigkeiten in einem echten Klassentest
- Wenn gewünscht, wiederholen Sie den Vorgang rekursiv bis zu externen Abhängigkeiten.