Mehrere Schnittstellenimplementierungen mit denselben Tests testen - JUnit4

8

Ich möchte dieselben JUnit-Tests für verschiedene Schnittstellenimplementierungen ausführen. Ich habe mit der Option @Parameter eine schöne Lösung gefunden:

%Vor%

Dieser Test wird zweimal ausgeführt, zuerst mit der GoodInterfaceImpl und dann mit der AnotherInterfaceImpl -Klasse. Aber das Problem ist, ich brauche für die meisten Testfälle ein neues Objekt. Ein vereinfachtes Beispiel:

%Vor%

Wenn der isEmptyTest nach dem insertTest ausgeführt wird, schlägt er fehl.

Gibt es eine Option, um jeden Testfall automatisch mit einer neuen Instanz einer Implementierung auszuführen?

Übrigens: Die Implementierung einer clear () oder reset () -Methode für die Schnittstelle ist nicht wirklich eine Option, da ich sie im produktiven Code nicht brauchen würde.

    
Moe Pad 18.06.2012, 09:31
quelle

4 Antworten

4

Erstellen Sie eine Factory-Schnittstelle und Implementierungen, möglicherweise nur in Ihrer Testhierarchie, wenn Sie dies in der Produktion nicht benötigen, und geben Sie getParameters() eine Liste der Factorys zurück.

Dann können Sie die Factory in einer @Before Annotationsmethode aufrufen, um für jede Testmethode eine neue Instanz Ihrer tatsächlichen Klasse zu testen.

    
Don Roby 18.06.2012, 09:52
quelle
5

Hier ist ein anderer Ansatz mit dem Template Method-Muster:

Die schnittstellenorientierten Tests gehen in die Basisklasse:

%Vor%

Definieren Sie für jede konkrete Klasse eine konkrete Testklasse:

%Vor%

Ein kleiner Vorteil gegenüber @Parameter ist, dass Sie den Namen der konkreten Testklasse erhalten, wenn ein Test fehlschlägt, damit Sie sofort wissen, welche Implementierung fehlgeschlagen ist.

Übrigens, damit dieser Ansatz überhaupt funktioniert, muss die Schnittstelle so gestaltet sein, dass sie nur mit den Schnittstellenmethoden getestet werden kann. Dies bedeutet, dass Tests auf Statusbasis durchgeführt werden. Sie können Mocks in der Basis-Testklasse nicht überprüfen. Wenn Sie Mocks in implementierungsspezifischen Tests überprüfen müssen, müssen diese Tests in die konkreten Testklassen eingehen.

    
user1909402 23.02.2013 22:42
quelle
1

Nur für den Fall, dass jemand hier ankommt (wie ich es getan habe), nach mehreren Implementierungen der gleichen Schnittstelle in .net zu testen, könnten Sie einen der Ansätze sehen, die ich in einem der Projekte verwendet habe hier

Unten ist, was wir in Kürze folgen.

Die gleiche Testprojekt-DLL wird zweimal mit vstest.console ausgeführt, indem eine Umgebungsvariable festgelegt wird. Innerhalb des Tests (entweder in der Assembly initialize oder test initialize) werden die entsprechenden Implementierungen basierend auf dem Umgebungsvariablenwert in einem IoC-Container registriert.

    
Rahul P Nath 10.01.2015 08:29
quelle
0

In Juni 5 könntest du tun:

%Vor%     
cnmuc 05.11.2017 10:23
quelle

Tags und Links