Oggi ho fatto una breve sessione in Pair Programming con Antonio in cui abbiamo applicato il TDD per risolvere dei dubbi di disegno su come sostituire ad una applicazione la funzione di salvataggio in XML dei dati di configurazione. Ben presto è emersa l'utilità di usare un mock object per poter testare separatamente la rappresentazione dei dati dalla sua persistenza. Questa è stata l'occasione per me per conoscere TypeMock.NET (tool commerciale a pagamento).
TypeMock.NET rispetto ad altre librerie di mock object come ad esempio NMock ha un pregio che mi ha subito colpito e conquistato nonostante non sia open-source: permette di fare il Mock di ogni classe senza i vincoli tipici di quetste librerie: può fare il Mock di ogni classe e quindi anche di classi sealed e di metodi non virtual, non impone cioè il vincolo di fare il mock di sole interfaccie e classi astratte e metodi virtuali.
L'idea di introdurre una interfaccia non richiesta o rendere virtual un metodo che non deve essere specializzato per potrne fare il mock mi è piace poco, se poi la classe di cui fare il mock appartiene ad una libreria compilata di terze parti la cosa non è nemmeno possibile. TypeMock.NET non pone queste limitrazioni perchè per funzionare non usa l'ereditarietà e nemmeno l'intercettazione delle chiamate attraverso il remoting e il MarshalByRefObject. TypeMock.NET invece fa uso delle Profiling API del .NET Framework cosa che non pone limitazioni ed evita di introdurre sovrastrutture al codice che si desidera testare. Insomma una figata ;-)
P.S. funziona sia con .NET 1.1 che con VS2005.
Update: quella che sembrava una feature fantastica, la possibilità di moccare classi concrete e altre simili, ha avuto l'effetto di nascondere le smell sulle scelte di disegno del codice sotto test che è lo scopo principale dello unit testing - e tutta questa "potenza" nel teampo ha prodotto test instabili che falliscono a intermittenza. In conclusione imo TypeMock.NET non è un buon tool di mocking
_