In primo luogo, le interfacce sono solitamente delle dipendenze più semplici da riempire / schernire quando si esegue il test delle unità, perché il comportamento predefinito è ... nulla, quindi si può essere sicuri di testare le classi in modo isolato.
In secondo luogo, quando hai bisogno di creare una simulazione personalizzata, non devi fare niente di speciale, basta scrivere una classe che eredita l'interfaccia. Ciò semplifica la fornitura delle dipendenze alle tue classi durante i test e, a volte, l'implementazione di simulazione è la seconda implementazione che stai cercando.
In terzo luogo, se stai solo scrivendo una classe, fai clic con il tasto destro del mouse su > estrai l'interfaccia ogni volta, non stai interpretando correttamente la "I" in "SOLID". La segregazione dell'interfaccia implica che le interfacce siano progettate per il CLIENT dell'interfaccia e non per corrispondere all'implementazione. C'è una differenza importante in quanto il primo tipicamente produrrà un design più liberamente accoppiato. A volte è una linea molto sottile, ma vale la pena tenerla d'occhio.
Ovviamente, se non sei interessato ai test unitari e non sei interessato a SOLID, codice manutenibile e verificabile, allora sì ... le interfacce potrebbero non avere molto valore pratico se non hai implementazioni multiple in fase di esecuzione.