Attualmente sto rifattorizzando un progetto esistente, che è stato creato senza TDD. Esiste una gerarchia di classi con una classe base astratta e due sottoclassi. Nel design originale, queste classi erano per lo più solo possessori di dati senza molto comportamento. Ho identificato alcune funzionalità che dovrebbero essere implementate nella classe base, e mi piacerebbe scrivere test per questa funzionalità ora. Ma dal momento che la classe è astratta, non posso istanziarla (ovviamente).
Nota: la funzionalità che vorrei testare non richiama alcun metodo pure virtual
.
class Base {}; // Is abstract
TEST(BaseTest, doesSomethingAmazing) {
Base aBase; // <-------- Not possible!!!
ASSERT_THAT(aBase.amazeMe(), Eq(AMAZING_RESULT));
}
Modifica: per chiarire alcune cose:
- L'ereditarietà ha effettivamente senso in questa situazione - entrambe le sottoclassi mappano a concetti specifici del dominio e il polimorfismo aiuta a mantenere pulito il codice circostante
- Esiste un comportamento che verrà utilizzato in entrambe le sottoclassi e che richiede dati comuni a entrambe le classi. Quindi penso che abbia senso metterlo in una super classe comune.
Posso pensare a diverse soluzioni possibili, ma nessuna mi sembra ottimale:
- Aggiungi una sottoclasse al codice di test, che implementa tutte le funzioni
pure virtual
. Lato negativo: difficile nominare la sottoclasse in modo conciso, comprendere i test diventa più difficile - Crea un'istanza di un oggetto della sottoclasse. Lato negativo: rende i test abbastanza confusi
- Aggiungi implementazioni vuote alla classe base. Lato negativo: la classe non è più astratta
Tendo all'opzione 3, per rendere i test più chiari possibile, ma non ne sono veramente soddisfatto. C'è un modo migliore di cui non sono a conoscenza?