Unit-Test Tools: Dumbster (Fake Mailserver)
In meinem Projekten begegne ich oft den gleichen Phänomenen: Unit-Tets sind vorhanden, aber sehr rudimentär (paar Tests für irgendwelche statischen Methoden, wenn man Glück hat werden noch Datenbankzugriffe getestet). Eine Erklärung dafür könnte sein, daß das Aufbauen eines entsprechenden Test-Environments nicht richtig durchgeführt wurde und es im Nachhinein zu komplex ist, wenn mehr als eine Datenbank benötigt wird, z. B. Testdaten müssen vorhanden sein, FTP oder E-Mailserver werden verwendet uws. Hier hat der Architekt versagt, aber auch solche Umgebungen lassen sich langsam erweitern. Dazu möchte ich hier ein paar Tools vorstellen, die ich im letzten Projekt einsetzen konnte. Wir beginnen mit Dumbster (http://quintanasoft.com/dumbster/), einem Fake Mailserver unter der Apache License 2.0.
Dumbster ist im Maven Repository und kann mittels pom.xml eingebunden werden
<dependency> <groupId>dumbster</groupId> <artifactId>dumbster</artifactId> <version>1.6</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.3</version> <scope>test</scope> </dependency>
Er wird einfach über einen Konstruktor in der setUp-Methode erstellt und dem Container (in meinem Fall JEE mit OpenEJB) mitgeteilt:
mockMailServer = SimpleSmtpServer.start(2525);
// mail resource
p.put("mail/postman", "new://Resource?type=javax.mail.Session");
p.put("mail/postman.mail.smtp.host", "localhost");
p.put("mail/postman.mail.smtp.port", "2525");
p.put("mail/postman.mail.transport.protocol", "smtp");
p.put("mail/postman.mail.smtp.auth", "false");
Entsprechende Unit-Tests könnten dann so aussehen:
... JAVA Code, der E-Mails via @Resource(name = "mail/postman") verschickt
assertEquals(3, mockMailServer.getReceivedEmailSize());
Iterator iter = mockMailServer.getReceivedEmail(); // get first email
SmtpMessage smtpMessage = (SmtpMessage) iter.next();
assertEquals("Test", smtpMessage.getHeaderValue("Subject"));
assertEquals("Test User <from@localhost>", smtpMessage.getHeaderValue("From"));
assertEquals("Hallo Welt!", smtpMessage.getBody());