I'm currently learning about TDD techniques, one of the suggestion is to test only public methods and skip the private ones
Sì, TDD concentra gli sforzi sulla definizione del test tramite il contratto e prima di ottenere l'implementazione in un secondo momento. Definiamo prima i metodi (principalmente pubblici), i loro argomenti, i loro tipi di ritorno e le eccezioni che possono essere lanciati.
Questi contratti potrebbero o potrebbero non provenire da interfaces
o virtual methods
. Potrebbero essere semplici metodi vuoti di una nuova classe. Quindi, no, non provengono tutti da un'interfaccia . TDD non forzerà il tuo design in questo modo. 1
I have also been reading about Mocking
Ecco dove ti stai perdendo. Mock (IMO) sono una tecnica avanzata per i test. Non direttamente coinvolto con TDD. Puoi ancora seguire TDD senza mock. I mock sono indirizzati per testare componenti con pesanti dipendenze (come ha commentato @ guillamue31 nella sua risposta). fornisce un'istanza "falsa" di una determinata interfaccia. Un comportamento che può essere programmato per soddisfare le condizioni richieste per il caso d'uso in esame. Potrebbe essere anche una lezione. Sì, anche le classi concrete possono essere derise.
When I start developing my application I don't know which methods I
will want to mock while creating unit tests, because of that I think
it's best to make them all available for mocking.
Bene. Lascia che TDD dica quali componenti sono buoni candidati da prendere in giro. Dopo diverse iterazioni di TDD, una volta che i test diventano ecologici, è più facile vedere quali componenti devono essere disaccoppiati e quindi i candidati devono essere derisi. Ma tieni presente che non tutte le singole dipendenze implicano un'interfaccia. Dipende da te decidere in base a requisiti, esigenze e preferenze.
1: Mi piacerebbe condividere un video di Sandro Mancuso che implementa i kata di Rovers Mars . Vedrai che non ha usato alcuna interfaccia per testare i contratti. Mancuso è molto favorevole a questa metodologia e lo incoraggia a tutti i suoi dipendenti
2: Nota che Sandro sta seguendo TDD e che i metodi di Rover sono protetti !!! Sta giocando con l'ambito del pacchetto. Test e classe concreta sono nello stesso pacchetto. Quindi, TDD non ci obbliga nemmeno a definire metodi come pubblici.