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.


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.