Mock Java Mail

Aujourd’hui, en me levant, j’ai vu un gars très respectable (Mister DOJ) twitter un lien vers http://mocksmtpserver.codeplex.com, grosso modo, c’est un mini serveur SMTP qui crache dans la console tous les mails qu’il devrait envoyer.
Alors, ca à l’air bien comme ça, reste que d’un premier coup d’oeil, j’aurai tendance à préférer mock-javamail. Et si respectable DOJ ne mentionne pas mock-javamail, d’autres ne doivent pas en connaître l’existence.
Le truc dommage, c’est qu’en recherchant un peu, on retrouve plus la doc (oracle qui rachète sun, tout ca).
Y’a peut-être un projet qui à pris la suite (et dans ce cas, je suis pas au courant), mais en tout cas, ca marche toujours bien et ça permet de mocker l’envoi de mail (remarquez avec un nom comme ça, on aurait pu s’en douter). Mais à la différence de mocksmtpserver, il va faire ça en mémoire.
Aller un petit exemple de code…
Prenons le cas où on utilise spring et comme dans la doc (http://static.springsource.org/spring/docs/3.0.x/reference/mail.html) on envoi ses mails avec un bout de code tout simple :

public void sendMessage() {
// of course you would use DI in any real-world cases
JavaMailSenderImpl sender = new JavaMailSenderImpl();
sender.setHost("mail.host.com");
MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);
helper.setTo("test@host.com");
helper.setText("Thank you for ordering!");
sender.send(message);
}

Un truc magique avec, c’est que pour mettre le mock et tester ce bout de code, il suffit de mettre le jar dans le classpath de notre application, donc si vous utilisez Maven (si vous l’utilisez pas, faites le), on rajoute la dépendance :

<dependency>
<groupId>org.jvnet.mock-javamail</groupId>
<artifactId>mock-javamail</artifactId>
<version>1.7</version>
<scope>test</scope>
</dependency>

Et hop, comme par magie, les mails ne sont plus envoyés mais stockés dans une grosse Map, et voici un test qu’on peut faire :

@Test
public void testSendMessage() throws Exception {
// Hop, c'est là que c'est cool, on accède à une pseudo boite mail des users (une List), le tout en mémoire
Mailbox mailbox=Mailbox.get("test@host.com");
assertTrue(mailbox.isEmpty());
// l'appel de la méthode
mailer.sendMessage();
// on teste qu'on a bien reçu un message
assertFalse("The mock mailbox is empty", mailbox.isEmpty());
assertEquals(1,mailbox.size());
// vu qu'on est en mémoire, on peut tester le contenu
Message message=mailbox.get(0);
assertEquals("Thank you for ordering!",message.getSubject());
}

Donc, pour moi, ça reste LE framework à retenir pour tester l’envoi de mail en java car il est simple d’utilisation, non-intrusif, bref il fait le job et il le fait bien.