Mock SMTP-Server für Unit-Tests

Die meisten Enterprise-Anwendungen müssen mittlerweile in der Lage sein, E-Mails an Benutzer zu versenden. So ist es beispielsweise beim sog. Double Opt-in-Verfahren notwendig, dass der Benutzer einen Link aufruft, dem ihm zuvor per E-Mail zugesendet wurde, um so die Authentizität seiner E-Mail-Adresse zu gewährleisten. Dies ist ein gängiges Verfahren, das häufig nach der Registrierung eines Benutzers über eine Weboberfläche eingesetzt wird.

In immer größer werdenden Anwendungen spielen auch automatisierte Tests eine immer größere Rolle, da nur so dauerhaft und mit vertretbarem Aufwand eine hohe Qualität der Anwendung sichergestellt werden kann. Um den oben beschriebenen Workflow automatisiert zu testen, ist es sinnvoll auch den korrekten Versand der E-Mail und den darin enthalten Link zu prüfen.

Dumbster ist ein simpler SMTP-Server unter der Apache License 2.0., der sich einfach in einen automatisierten Test integrieren lässt und mit dem es anschließend möglich ist, den korrekten Versand von E-Mails innerhalb eines Unit-Tests zu prüfen. Der folgende JUnit-Test soll dies verdeutlichen:

public class UserServiceTest {

	private UserService userService;

	private SimpleSmtpServer smtpServer;

	@Before
	public void init() {
		userService = new UserService();
		smtpServer = SimpleSmtpServer.start(44444);
	}

	@After
	public void tearDown() {
		smtpServer.stop();
	}

	@Test
	public void testCreateUser() {
		userService.createUser("dumbster.test@oio.de");

		// Wurde die Double-Opt-In-Mail beim Anlegen des Benutzers korrekt versendet?
		SmtpMessage smtpMessage = ((SmtpMessage) smtpServer.getReceivedEmail().next());
		assertEquals("dumbster.test@oio.de", smtpMessage.getHeaderValue("To"));
		assertEquals("Account aktivieren", smtpMessage.getHeaderValue("Subject"));
		assertEquals("Bitte bestätigen Sie...", smtpMessage.getBody());
	}
}

Mit dem Aufruf von SimpleSmtpServer.start(44444) wird der SMTP-Server gestartet und nimmt anschließend alle E-Mails entgegen, die über SMTP an localhost auf Port 44444 gesendet werden. In diesem Beispiel wird davon ausgegangen, dass beim Anlegen eines Benutzer über userService.createUser(...) eine Aktivierungsmail an die übergebene E-Mail-Adresse gesendet wird, die anschließend geprüft werden muss. Auf die empfangenen Nachrichten des SMTP-Servers kann über smtpServer.getReceivedEmail() zugegriffen werden. Damit ist es unter anderem möglich die Empfänger-Mail-Adresse, den Betreff und den versendeten Text zu prüfen.

Short URL for this post: https://wp.me/p4nxik-UH
This entry was posted in Java and Quality and tagged , , , , , . Bookmark the permalink.

2 Responses to Mock SMTP-Server für Unit-Tests

  1. Avatar shora says:

    Hallo und vielen Dank für nette Information. Mich würde interessieren, wie man einen User mit Passwort innerhalb meiner JUnit test anlegen kann? Über eine Antwort wäre ich sehr dankbar.

  2. Thorsten Maier Thorsten Maier says:

    Das Anlegen des Benutzers liegt nicht im Scope dieses einfachen Beispiels. Es wird davon ausgegangen, dass der verwendete “UserService” einen Benutzer in der Persistenz anlegt und anschließend eine E-Mail innerhalb des Services versendet wird. Der E-Mail-Versand wird anschließend im Unit-Test geprüft. Wie das Anlegen des Benutzers konkret funktioniert ist in diesem Fall irrelevant.

Leave a Reply