Sulla base del anwser di @dasblinkenlight e this anwser mi si avvicinò con un'implementazione per il mio caso d'uso che mi piacerebbe condividere.
Uso lo ServiceProviderPattern (difference API and SPI) per le classi che implementano l'interfaccia IImporterService
. Se viene sviluppata una nuova implementazione dell'interfaccia, è necessario modificare solo un file di configurazione in META-INF/services/ per registrare l'implementazione.
Il file in META-INF/services/ prende il nome il nome completo della classe dell'interfaccia di servizio (IImporterService
), ad esempio,
de.myapp.importer.IImporterService
Questo file contiene una lista di casses che implementano IImporterService
, per esempio
de.myapp.importer.impl.OfficeOpenXMLImporter
La classe factory ImporterFactory
fornisce ai clienti implementazioni concrete dell'interfaccia.
Le ImporterFactory
restituisce un elenco di tutte le implementazioni dell'interfaccia, registrati attraverso il ServiceProviderPattern. Il metodo setUp()
garantisce che venga utilizzata una nuova istanza per ogni caso di test.
@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() {
}
}
Il metodo ImporterFactory.INSTANCE.getImplementations()
è simile al seguente:
public List<IImporterService> getImplementations() {
return (List<IImporterService>) GenericServiceLoader.INSTANCE.locateAll(IImporterService.class);
}
fonte
2016-07-19 12:04:37
cosa intendi "lo stesso oggetto viene utilizzato per eseguire tutti i test"? –
Come ex dipendente da una junit, vorrei solo dire che dovresti dare un'occhiata a groovy/spock. Spock è cool e groovy ti dà alcune abilità che non puoi fare con junit. Uno dei miei aspetti preferiti è l'accesso ai membri di dati privati, quindi non devi esporre qualcosa solo per creare un test unitario adeguato. – Thom