Você não E seu próprio exemplo é perfeito para mostrar por que não.
Você quer enviar e-mails, certo? Então você cria em algum lugar uma classe estáticaCommunicationUtilities
com uma estática SendEmail()
nela. Você usa esse método de alguma classe que faz várias coisas; por exemplo, redefine a senha de um usuário e envia uma nova por email. Perfeito.
Agora, o que acontece se você quiser testar sua classe? Você não pode, porque toda vez que deseja testar o método que redefine a senha, ele altera o banco de dados (o que não é adequado para um teste de unidade) e, além disso, envia um e-mail (o que é ainda pior).
Você pode ter lido sobre a Inversão de controle, que tem o benefício de facilitar o teste de unidade. Os artigos sobre IoC explicarão que, em vez de fazer algo como:
void ResetPassword(UserIdentifier userId)
{
...
new MailSender().SendPasswordReset(userMail, newPassword);
}
Você faz:
void ResetPassword(IMailSender sender, UserIdentifier userId)
{
...
sender.SendPasswordReset(userMail, newPassword);
}
que permite usar zombarias e tocos.
Tente aplicar a IoC ao seu CommunicationUtilities
. Certo, você não pode. É por isso que está quebrado.