Basierend auf den anwser von @dasblinkenlight und this anwser ich mit einer Implementierung für meinen Anwendungsfall kam, Ich mag würde teilen.
Ich verwende die ServiceProviderPattern (difference API and SPI) für Klassen, die die Schnittstelle IImporterService
implementieren. Wenn eine neue Implementierung der Schnittstelle entwickelt wird, muss nur eine Konfigurationsdatei in META-INF/services/ geändert werden, um die Implementierung zu registrieren.
Die Datei in META-INF/services/ ist benannt nach dem voll qualifizierten Klassennamen der Service-Schnittstelle (IImporterService
), z.B.
de.myapp.importer.IImporterService
Diese Datei enthält eine Liste von casses die IImporterService
, zum Beispiel implementieren
de.myapp.importer.impl.OfficeOpenXMLImporter
Die Factory-Klasse ImporterFactory
bietet seinen Kunden konkrete Implementierungen der Schnittstelle.
Die ImporterFactory
gibt eine Liste aller Implementierungen der Schnittstelle, über die ServiceProviderPattern registriert. Die Methode setUp()
stellt sicher, dass für jeden Testfall eine neue Instanz verwendet wird.
@RunWith(Parameterized.class)
public class IImporterServiceTest {
public IImporterService service;
public IImporterServiceTest(IImporterService service) {
this.service = service;
}
@Parameters
public static List<IImporterService> instancesToTest() {
return ImporterFactory.INSTANCE.getImplementations();
}
@Before
public void setUp() throws Exception {
this.service = this.service.getClass().newInstance();
}
@Test
public void testRead() {
}
}
Die ImporterFactory.INSTANCE.getImplementations()
Methode sieht wie folgt aus:
public List<IImporterService> getImplementations() {
return (List<IImporterService>) GenericServiceLoader.INSTANCE.locateAll(IImporterService.class);
}
was meinst du "das gleiche Objekt wird verwendet, um alle Tests auszuführen"? –
Als ehemaliger Junit-Süchtiger möchte ich nur sagen, dass man sich groovy/spock anschauen sollte. Spock ist cool und groovy gibt dir einige Fähigkeiten, die du mit Junit einfach nicht kannst. Eine meiner Lieblingssachen ist der Zugriff auf private Datenmitglieder, so dass Sie nicht nur etwas offenlegen müssen, um einen korrekten Komponententest zu erstellen. – Thom