2010-04-11 7 views
2

Une partie de mon application dépend de JavaMail, de l'organisation des messages, etc. Est-il possible de tester ce module sans lancer un serveur IMAP pour exécuter les tests? Je suis toujours bloqué quand il s'agit de tester des choses qui dépendent de serveurs ou de modules externes.Test des modules JavaMail associés

Répondre

1

Ce que vous ne pouvez pas tester sans serveur IMAP est, si votre application envoie un e-mail. Mais toutes les autres choses que vous pouvez si vous concevez votre code correctement. Ce que vous devriez faire est de séparer votre dépendance. Qu'est-ce que ça veut dire?

Votre code doit accéder au code tiers (JavaMail dans ce cas) à un seul endroit (la plupart du temps == une seule classe). Séparez cette classe avec une interface du reste du code, de sorte que vous puissiez utiliser un objet factice dans vos tests.

Voici un exemple ce que vous ne devriez pas faire (en supposant JavaMail est la dépendance externe):

class Application { 
    public run(String[] receiverList, String message, String body) { 
     for (String receiver : receiverList) { 
      JavaMail.sendMessage(receiver, message, body); 
     } 
    } 
} 

Vous ne pouvez pas tester la boucle dans ce cas. Pour ce faire, à la place:

class Application { 
    private IApplicatioNMail mail; 

    public Application(IApplicationMail mail) { 
     this.mail = mail; 
    } 

    public run(String[] receiverList, String message, String body) { 
     for (String receiver : receiverList) { 
      mail.sendMessage(receiver, message, body); 
     } 
    } 
} 

class JavaApplicationMail implement IApplicationMail { 
    public sendMessage(String receiver, String message, String body) { 
     JavaMail.sendMessage(receiver, message, body); 
    } 
} 

De cette façon, vous pouvez créer un mannequin (maquette, peu importe) dans vos tests pour remplacer le JavaApplicationMail. Dans vos tests, la réception externe n'est jamais appelée).

Un test pourrait ressembler à quelque chose comme ça:

@Test 
public void sentThreeMails() throws Exception { 
    IApplicationMail mailCounter = new MailCounter(); 
    Application application = new Application(mailCounter); 
    application.run(new String[] { "one", "two", "three" }, "Hello", "Blah!"); 

    assertEquals(3, mailCounter.calls); 
} 

class MailCounter implements IApplicationMail { 
    public counter = 0; 

    public sendMessage(String receiver, String message, String body) { 
     counter++; 
    } 
} 
2

Essayez d'utiliser cette mock pour votre test

1

À partir d'un serveur IMAP pour votre suite de tests pourrait effectivement être une bonne idée. GreenMail a été conçu dans ce but, il vous permet d'exécuter des serveurs IMAP/POP3/SMTP en mémoire à partir du code Java.