Ho questo problema con i test delle unità per anni. Il test delle unità dovrebbe testare le unità isolate, cioè, se usiamo il vocabolario di interfaccia / implementazione, dovrebbe testare le classi di implementazione concreta. Bene, facciamolo. In un codice che è il client dell'interfaccia, si dovrebbe prendere in giro l'interfaccia per soddisfare i test. Va bene, facciamolo dove possibile, anche.
Ma poi, nel codice di produzione, c'è un posto in cui la classe di implementazione effettiva viene istanziata e utilizzata come l'istanza che implementa l'interfaccia. Può essere un metodo di fabbrica, può essere da qualche altra parte.
Ho il problema di testare realmente questa colla tra questi due, testati isolatamente, strati. L'uso di varianti di instance of
è fragile, per non dire che il creatore dell'istanza reale può essere "intelligente" e scegliere un'implementazione diversa in base alle circostanze. Anche se non lo è, crea quell'istanza usando alcune configurazioni in giro.
Finora, non eseguo test unitari in modo rigoroso (quindi non faccio new Foo(directa, directb)
, ma createApp(indirectA, indirectB).getFoo()
), ma potrebbe non essere il test dell'unità corretto. Ciò non verifica tutte le implementazioni, che testano quelle implementazioni-app-usi. Un altro approccio che potrei vedere è quello di effettuare test del parametro di implementazione di Foo, con un metodo factory makeFoo(a,b)
e creare sottoclassi per ogni implementazione e uno che crea tali istanze tramite un'app reale.
Conosci un buon modo su come affrontarlo?
In altre parole, la domanda potrebbe essere semplicemente "Come testare (unità) il codice della colla?"