Ty nie. A twój własny przykład jest idealny, aby pokazać, dlaczego nie.
Chcesz wysyłać e-maile, prawda? Więc tworzysz gdzieś klasę statyczną CommunicationUtilities
ze statyczną zawartością SendEmail()
. Używasz tej metody z klasy, która robi mnóstwo rzeczy, na przykład resetuje hasło użytkownika i wysyła mu nowe przez e-mail. Doskonały.
Co się stanie, jeśli chcesz przetestować jednostkę w klasie? Nie możesz, ponieważ za każdym razem, gdy chcesz przetestować metodę, która resetuje hasło, zmienia bazę danych (co nie nadaje się do testu jednostkowego), a ponadto wysyła wiadomość e-mail (co jest jeszcze gorsze).
Być może przeczytałeś o Inwersji Kontroli, która ma tę zaletę, że ułatwia testowanie jednostek. Artykuły o IoC wyjaśniają, że zamiast robić coś takiego:
void ResetPassword(UserIdentifier userId)
{
...
new MailSender().SendPasswordReset(userMail, newPassword);
}
ty robisz:
void ResetPassword(IMailSender sender, UserIdentifier userId)
{
...
sender.SendPasswordReset(userMail, newPassword);
}
co pozwala używać makiet i odcinków.
Spróbuj zastosować IoC do swojego CommunicationUtilities
. Racja, nie możesz. Dlatego jest zepsuty.