2009-06-22 11 views
29

Voglio eseguire test di unità (Junit) su alcune classi di modelli che in genere inviano e-mail che confermano che le cose sono andate. Esiste un server di posta elettronica fittizio che puoi utilizzare con unit test che ti consente di confermare che la tua corsa ha provato a inviare un'email senza effettivamente inviare le email?Esecuzione di test di e-mail Junit senza messaggi di posta elettronica in corso

Sembra che sarebbe bello averlo, ma non sono sicuro di voler scrivere il mio. Lo stack di app per l'aspetto dell'email è Velocity + Spring, quindi sarebbe preferibile puntare il server di test semplicemente cambiando il file applicationContext.xml.

+0

Controllare la mia risposta http://stackoverflow.com/questions/8599791/a-simple-local-smtp-server/22043597#22043597 –

risposta

27

Risposta alternativa: Dumbster è un server SMTP falso progettato per il test. È scritto in Java.

+4

+1 per questo approccio, sebbene SubEthaSMTP potrebbe essere più semplice da utilizzare rispetto a Dumbster. –

+0

Questo fa esattamente quello che ho chiesto. Lo userò per ora, probabilmente passerò ad usare un oggetto mock a un certo punto per velocizzare il test. – stevedbrown

+1

Solo una nota: in esecuzione con Dumbster, il mio test di unità richiede circa 500 ms per avviare il server, inviare un'email e verificare che l'email sia stata inviata. Questo è significativamente migliore rispetto ai miei test di struttura Jersey che impiegano anni. – stevedbrown

14

Penso che il progetto Mock JavaMail sia quello che desideri.

+0

Assolutamente - deridere mai un 3a parte interfacciarsi soli, è raramente ne vale la pena. (se volevi - usare PowerMock). Ma in questo caso, basta mettere Mock JavaMail sul posto, e magicamente tutti i tuoi messaggi saranno conservati in una finta Mailbox per te da esaminare e far valere. Semplice ed efficace (basta tenerlo fuori dal classpath di produzione!) – Phantomwhale

+0

c'è un quickstart: http://ollivander.franzoni.eu/2011/08/30/mock-javamail-primer/ – jediz

+1

Il sito collegato è chiuso. – holmis83

0

La mia soluzione era di avvolgere il server di posta in una classe che accetta tutte le opzioni di configurazione e ha un metodo send(). Nei miei test, prenderei in giro questa classe e sostituisco send() con qualcosa che salva i parametri correnti per l'asserzione.

Per verificare che il servizio di posta funzioni, inviare una corrispondenza locale. Prova hMail se sei su Windows.

+0

Sviluppo su Windows, ma eseguo il server di integrazione continua su Ubuntu, in modo che non funzioni. – stevedbrown

+0

Sicuro; usa l'indirizzo "localhost" o "127.0.0.1" e aggiungi lo stesso account su Ubunutu per la posta come su Windows. Non sono sicuro di cosa usi Ubuntu ma ha già installato un server di posta. Probabilmente qmail o postfix. –

3

Suppongo tu stia utilizzando Javamail e il problema è che javax.mail.Session è definitivo e quindi non può essere preso in giro.

Sembra che altri abbiano suggerito di definire semplicemente la propria interfaccia di "sessione di posta" e creare un'implementazione che utilizza Javamail. Nei test, quindi, si inietta semplicemente una simulazione mentre in "modalità mondo reale" si inietta l'implementazione di Javamail.

Sia JMock che EasyMock supporteranno tutte le asserzioni che potreste voler fare sul messaggio che state inviando e il test è completo.

Per inciso, in genere cerco di evitare chiamate out-of-process dai test delle unità: ti uccide quando esegui frequentemente la suite di test, che normalmente si traduce in una minore esecuzione e in base al codice. problemi iniziano a verificarsi.

+0

Questo è davvero un buon commento e mi ha fatto riflettere sul mio approccio ancora. Stavo pensando di generare un processo, ma più probabilmente, dovrei creare un'istanza di un bean nel mio xml di configurazione di primavera che prende in giro un server di posta elettronica. – stevedbrown

+0

Ciao Steve: questo è esattamente il punto. Se hai un altro processo in esecuzione come punto finale all'improvviso, le asserzioni diventano difficili, quindi il tuo test finisce semplicemente per assicurarti di non ottenere errori dall'altro processo, che probabilmente non è lo stesso sarà usato in rabbia quindi è davvero un test muto - dopotutto penso che sia sicuro assumere che Javamail funzioni ;-) L'approccio beffardo ti permette di convalidare il contenuto del messaggio che penso sia il vero test .... –

1

Si può provare JavaMail Mock2 https://github.com/salyh/javamail-mock2

Il suo obiettivo primario di IMAP/POP3 ma SMTP Mock è anche disponibile. È disponibile in Maven centrale.

Caratteristiche

  • supporto IMAP, imaps, pop3, POP3S, smtp, SMTPS
  • supportata per POP3: cast POP3Folder, Folder.getUID (Message msg)
  • supportata per IMAP: cast IMAPFolder, cast UIDFolder, sottocartelle, -Folder.getMessagesByUID (...), cancellare/rinominare le cartelle, aggiungere messaggi
  • Supporto per SMTP: Mock Transport.send()
  • non supportato per il momento: le estensioni IMAP come IDL E, CONDSTORE, ...e trasmette a POP3Message/IMAPMessage, archivia listener
Problemi correlati