A quelques heures de mon départ pour Devoxx je termine une petite démo basée sur Apache Camel et Apache Wicket. Je vous proposerai bientôt un grand article à tremper dans votre café mais là aujourd’hui je fais la version courte.
Si vous avez déjà eu à tester JavaMail dans votre application, je parle de tests d’intégrations, sachez qu’il existe une petite librairie bien sympathique pour « mocker » du code Java. Disons que vous souhaitez envoyer un email de votre interface Web pour remettre un mot de passe à zéro. Comment écrire un test unitaire sans utiliser un vrai serveur SMTP ?
Mock JavaMail permet de simuler une boîte aux lettres et de se comporter comme un serveur SMTP pour l’envoi, un serveur POP3 ou IMAP pour la réception.
Prenons par exemple un projet très simple. Voici tout d’abord la dépendance que j’ai ajoutée à mon fichier pom.xml :
org.jvnet.mock-javamail mock-javamail 1.7
Prenons ensuite un test unitaire qui génère un email afin de tester l’envoi. Tout d’abord voici le code à améliorer qui génère un email afin de l’envoyer via smtp
private void sendSmtpEmail(Address from) throws MessagingException { Properties props = new Properties(); //props.put("mail.smtp.host", "localhost"); Session session = Session.getDefaultInstance(props, null); session.setDebug(true); // create a message SMTPMessage msg = new SMTPMessage(session); msg.setSubject("A simple test email"); msg.setFrom(from); msg.setContent("Email content","text/plain"); msg.setRecipients(MimeMessage.RecipientType.TO , "destinataire@yourdomain.com"); Transport tr = session.getTransport("smtp"); tr.connect("localhost", "anyUsername", "password"); msg.saveChanges(); // don't forget this tr.sendMessage(msg, msg.getAllRecipients()); tr.close(); }
Mock JavaMail se fiche pas mal du username et du password, donc vous pouvez mettre ce que vous voulez, tant que le serveur SMTP dans la construction de l’instance Transport est bien « localhost ».
Ensuite un exemple de code dans lequel je déclare un objet de type Mailbox, afin d’envoyer un email.
public void testSendMail() throws Exception { Address address = new InternetAddress("destinataire@yourdomain.com"); Mailbox mailbox = new Mailbox(address); assertTrue("The mock mailbox is not empty whereas it should be", mailbox.isEmpty()); // Classical code to send an email to a smtp server sendSmtpEmail(address); // Get a fresh reference to the mailbox mailbox=Mailbox.get("destinataire@yourdomain.com"); // Check that a mail has been received assertFalse("The mock mailbox is empty", mailbox.isEmpty()); Message message=mailbox.get(0); assertEquals("A simple test email",message.getSubject()); }
Vous pouvez maintenant facilement tester l’envoi des messages de votre application et vous assurer que tout fonctionne sans devoir passer par un FakeSMTP 🙂
Allez, rendez-vous à Devoxx.
J’ai déjà récupéré mon teeshirt du Paris JUG grâce à David, la fin de semaine s’annonce chargée.