Ho un interfaccia, ad es .:Riutilizzo di implementazioni di test in JUnit 4?
public interface Thing {
FrobResult frob(FrobInput);
}
E diverse implementazioni di tale interfaccia (ad esempio NormalThing
, ImmutableThing
, AsyncThing
) che sto cercando di testare.
Molti dei miei metodi di test servono davvero a garantire che l'interfaccia sia implementata correttamente e quindi siano duplicati su ciascuna implementazione Thing
. In JUnit 3 una soluzione comune a questo sarebbe creare una classe base (che si estende TestCase
) che è quindi sottoclassata da ciascuna classe di implementazione. Ma questo è l'approccio corretto per JUnit 4?
Possibili alternative a (credo) ordine crescente di preferenza:
cut'n'paste i metodi di prova duplicati. Non è affatto ASCIUTTO, ma credo sia meno preoccupante nei test che nel codice di produzione.
Creare una classe astratta con i metodi
@Test
e sottoclasse per ogni classe di test di implementazione. (Comunemente visto con i test JUnit 3 - è ancora un buon modo per andare in JUnit 4?)Metti i metodi di test comuni in una classe helper e invocalo su ogni implementazione. (Composizione invece dell'eredità.)
Qual è la migliore pratica per fare # 3? Forse un test @RunWith(Parameterized.class)
che è parametrizzato con ogni implementazione? O c'è un modo migliore per farlo?
Sì, è l'approccio corretto per creare una classe base che è quindi sottoclassata da ogni classe di implementazione in JUnit4. – DaveFar
@DaveBall: ti dispiacerebbe postare quella risposta? –
# 3 sarebbe molto più bello, e sono d'accordo con il tuo commento qui sotto che sembra che questo dovrebbe essere possibile. –