podstawie anwser z @dasblinkenlight i this anwser wymyśliłem implementacji dla mojego przypadku użycia, że chciałbym się podzielić.
Używam ServiceProviderPattern (difference API and SPI) dla klas implementujących interfejs IImporterService
. Jeśli zostanie opracowana nowa implementacja interfejsu, tylko plik konfiguracyjny w META-INF/services/ musi zostać zmieniony, aby zarejestrować implementację.
Plik w META-INF/services/ pochodzi od pełnej nazwy klasy interfejsu serwisowego (IImporterService
), na przykład
de.myapp.importer.IImporterService
Ten plik zawiera listę casses realizujących IImporterService
np
de.myapp.importer.impl.OfficeOpenXMLImporter
Klasa fabryka ImporterFactory
zapewnia klientom konkretnych implementacji interfejsu.
W ImporterFactory
Zwraca listę wszystkich implementacje interfejsu, zarejestrowanych przez ServiceProviderPattern. Metoda setUp()
zapewnia użycie nowej instancji dla każdego przypadku testowego.
@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() {
}
}
Sposób ImporterFactory.INSTANCE.getImplementations()
wygląda następująco:
public List<IImporterService> getImplementations() {
return (List<IImporterService>) GenericServiceLoader.INSTANCE.locateAll(IImporterService.class);
}
co masz na myśli "ten sam obiekt służy do wykonywania wszystkich testów"? –
Jako były narkoman, chciałbym powiedzieć, że powinieneś spojrzeć na groovy/spock. Spock jest fajny i groovy daje ci pewne umiejętności, których po prostu nie możesz zrobić na junicie. Jedną z moich ulubionych rzeczy jest dostęp do prywatnych danych, więc nie musisz ujawniać czegoś tylko po to, by stworzyć odpowiedni test jednostkowy. – Thom