Per i nostri scopi, questa è la stessa domanda di:
Assume I have two classes A
and B
:
abstract class A:
method foo: 42;
virtual method bar;
class B extends A:
method bar: self.foo() + 4;
How can I unit-test class B
, considering that I cannot mock A
?
Se la lingua che stai utilizzando è sufficientemente dinamica, potresti effettivamente sostituire il tipo A
con una classe derisa. Se la lingua tratta i tipi come oggetti di prima classe, è possibile eseguire una forma di iniezione delle dipendenze. Altrimenti, potresti ancora utilizzare la compilazione condizionale per passare dal% effettivo diA
ai test di produzione e integrazione e un simulato% diA'
per il test delle unità, ma è incline a nascondere o persino a creare bug.
Ma francamente, questa complessità mi sembra sciocca. Preferisco scrivere una suite di test unitari generali per il supertipo A
, che viene ereditato per ogni tipo B
che in qualche modo estende , fa o implementa A
. Poiché A
non può essere istanziato, può essere testato da un finto B'
. Successivamente, testerei gli altri sottotipi di A
sia con la suite di test A, sia con i loro test individuali.
Sì, puoi sostenere che questo è un po 'un test di integrazione piuttosto che un test unitario. Tuttavia, sarebbe saggio trattare l'intero tipo con tutte le cose ereditate e tutti i tratti composti in esso come unità, al contrario delle sole parti aggiunte di recente in questa classe.