Skip navigation

Envoyer des mails depuis une application Java (ou dans un autre langage), est un besoin assez courant (confirmation d’inscription, mot de passe oublié, newsletter, anniversaire, résumé d’activité…). Comment bien tester unitairement ce code qui nécessite un serveur pour être testé de bout en bout dans les conditions « réelles » ? L’idée est d’utiliser une implémentation mémoire d’un serveur SMTP, comme vous avez peut-être l’habitude de le faire en utilisant une base de données mémoire (H2, HSQLDB, …) pour tester vos DAO.

Comme serveur SMTP mémoire j’ai été amené à utiliser le module « Wiser » de « SubEtha SMTP » (correspond à l’ajout suivant dans gradle.properties testCompile 'org.subethamail:subethasmtp:3.1.7'). SubEtha SMTP propose plusieurs modules qui gravitent autour de l’envoie de mails, je vous laisse les découvrir si vous êtes intéressé. Voyons maintenant comment en quelques lignes de code il est possible d’assurer la qualité de vos envoies de mails.

Imaginons un module envoyant un e-mail à toutes personnes nées à une date donnée (ce code s’appuie sur la librairie commons-email).

Rien de bien compliqué dans ce code, le traitement envoie un e-mail pour souhaiter un bon anniversaire à toutes les adresses qu’on lui passe en paramètre et il calcul l’âge.  SmtpConfig est juste un POJO qui contient le host et le port du serveur SMTP. Certains diront que la classe viole SRP (calcul de l’âge et envoie de l’email), ce n’est pas faux, mais c’est juste pour l’exemple.

Nous pouvons tester unitairement cette classe très simplement :

La classe Wiser correspond au serveur SMTP mémoire. Ce serveur démarre sur le port que vous lui indiquez (5555 dans mon cas). Avant le test on démarre le serveur, après le test on coupe le serveur, et pendant le test on vérifie les messages présents sur le serveur. Un jeu d’enfant! L'exemple complet est disponible sous GitHub.