Quanto sono efficaci i test unitari nella realtà?
Ho l'impressione che ad un certo punto i test unitari si trasformino in test che testano la dipendenza tra l'oggetto sotto test e un altro oggetto. Certo, si possono sempre creare dipendenze astratte usando le interfacce, ma cosa succede quando anche le interfacce devono essere cambiate? Cosa succede se l'unità in prova non si basa più su tali dipendenze?
Se i nostri test falliscono a causa di problemi di dipendenza, vuol dire che sono troppo accoppiati al nostro codice? Inoltre, dobbiamo cambiarli ogni volta che cambiamo le dipendenze? Se succede abbastanza spesso, è un segno che il nostro design è sbagliato?
Tendevo a credere che i test unitari siano un modo efficace per testare la robustezza, ma se sono troppo accoppiati alle dipendenze che i nostri oggetti hanno con altri oggetti (siano espressi come interfacce), portano semplicemente a più sprechi di tempo nel fissare quei test per passare il nuovo design. Mi sbaglio?
Il fatto è che io sono perfettamente consapevole dell'esistenza di strutture di derisione e così via. Questo non è il problema. Il problema è che cosa succede quando cambi l'implementazione del tuo metodo e semplicemente non chiama più il mock, e inizi a vedere un gruppo di luci rosse nel tuo stack di test, perché i tuoi mock non sono chiamati come dovrebbero? Test di unità o di integrazione, qualcosa dovrebbe essere fatto qui, giusto?
Se inizio a scrivere diversi metodi di simulazione per ogni condizione di test che mi piace, cosa succede se decido di cambiare la firma della classe che ho deriso? Tutti i miei test vanno nel cestino, giusto? È normale, può essere evitato? È un problema di progettazione?