Non E il tuo esempio è perfetto per mostrare perché no.
Vuoi inviare e-mail, vero? Quindi crei da qualche parte una classe statica CommunicationUtilitiescon al suo interno una statica SendEmail(). Si utilizza questo metodo da una classe che fa un sacco di cose, ad esempio reimposta la password di un utente e gli invia una nuova via e-mail. Perfetto.
Ora, cosa succede se vuoi testare l'unità della tua classe? Non puoi, perché ogni volta che vuoi testare il metodo che reimposta la password, cambia il database (che non è adatto per un test unitario) e inoltre invia un'e-mail (che è anche peggio).
Potresti aver letto di Inversion of Control, che ha il vantaggio di semplificare i test unitari. Gli articoli su IoC spiegheranno che invece di fare qualcosa del tipo:
void ResetPassword(UserIdentifier userId)
{
...
new MailSender().SendPasswordReset(userMail, newPassword);
}
tu fai:
void ResetPassword(IMailSender sender, UserIdentifier userId)
{
...
sender.SendPasswordReset(userMail, newPassword);
}
che permette di usare beffe e tronconi.
Prova ad applicare IoC al tuo CommunicationUtilities. Giusto, non puoi. Ecco perché è rotto.