Das tust du nicht. Und Ihr eigenes Beispiel ist perfekt, um zu zeigen, warum nicht.
Sie möchten E-Mails verschicken, oder? Sie erstellen also irgendwo eine statische Klasse CommunicationUtilities
mit einer darin enthaltenen statischen SendEmail()
. Sie verwenden diese Methode aus einer Klasse, die eine Reihe von Aufgaben ausführt, z. B. das Kennwort eines Benutzers zurücksetzt und ihm eine neue per E-Mail sendet. Perfekt.
Was passiert nun, wenn Sie Ihre Klasse einem Unit-Test unterziehen möchten? Dies ist nicht möglich, da jedes Mal, wenn Sie die Methode testen möchten, mit der das Kennwort zurückgesetzt wird, die Datenbank geändert wird (was nicht für einen Komponententest geeignet ist) und außerdem eine E-Mail gesendet wird (was noch schlimmer ist).
Möglicherweise haben Sie etwas über Inversion of Control gelesen, was das Testen von Einheiten erleichtert. Artikel über IoC erklären Ihnen, dass Sie nicht etwa Folgendes tun müssen:
void ResetPassword(UserIdentifier userId)
{
...
new MailSender().SendPasswordReset(userMail, newPassword);
}
Sie machen:
void ResetPassword(IMailSender sender, UserIdentifier userId)
{
...
sender.SendPasswordReset(userMail, newPassword);
}
was erlaubt, Mocks und Stubs zu verwenden.
Versuchen Sie, IoC auf Ihren anzuwenden CommunicationUtilities
. Richtig, das kannst du nicht. Deshalb ist es kaputt.