Unit test di implementazione e comportamento

3

È possibile scrivere un test unitario (al contrario di un test di integrazione) nel seguente scenario:

  • Ho una lista di oggetti Foo , alcuni dei quali esistono già nel database, altri no
  • Voglio scorrere l'elenco, aggiornare quelli che ho già nel database e aggiungerne di nuovi

Quindi, scrivo un test che ha un FooImporter con un metodo importFoos(List<Foo> foos) . E poi ho bisogno di prendere in giro il mio livello DAO, quindi metto a punto il FooDAO che viene iniettato nella FooImporter ... e poi mi sento come se stessi verificando l'implementazione, non il comportamento! Nel mio test finisco con un sacco di aspettative sulle chiamate (ad es. Ho inserito un record Foo "esistente", poi ho preso in giro il comportamento di FooDAO per restituire true per il controllo di duplicato e quindi aggiungere un aspettativa per il comportamento dell'inserto ecc.)

Quindi posso effettivamente testare questa unità vicino al livello dati in modo efficace, o dovrei essere un test di integrazione? E se sì, non può essere fatto in modo sensato in modo TDD?

(Prima che questo venga contrassegnato come duplicato, questa domanda riguarda in realtà il discorso che ha ispirato questa domanda, ma la risposta in realtà non mi convince che questo risolva l'accoppiamento dei test con il comportamento di implementazione.)

    
posta Chris Cooper 02.07.2015 - 15:51
fonte

1 risposta

4

Un test unitario dovrebbe testare il lavoro che l'unità testata ha, né più né meno.

Se il tuo metodo ha il compito di accedere al database ed emettere i comandi UPDATE e INSERT come richiesto, allora questo è ciò che devi testare. Quando il tuo collaboratore è un database, l'emissione di SQL non è un dettaglio di implementazione: è il comportamento di tale unità.

Rispetto all'enorme quantità di codice che sfrutti utilizzando un vero database con il suo milione di LOC, potrebbe sembrare piccolo, ma quell'impressione è fuorviante.

Un test unitario dovrebbe essere piccolo. Piccoli test sono facili da ottenere. Piccoli test vanno bene con i piccoli metodi e anche i piccoli metodi sono facili da ottenere. Cercare di fare due cose contemporaneamente rende il tuo codice più grande del doppio, e quindi non è un buon compromesso.

    
risposta data 02.07.2015 - 15:57
fonte

Leggi altre domande sui tag