2009-06-22 17 views
29

Quiero ejecutar pruebas unitarias (Junit) en algunas clases modelo que normalmente enviarán correos electrónicos confirmando que sucedieron cosas. ¿Existe un servidor de correo falso que pueda usar con pruebas unitarias que le permitirán confirmar que su ejecución intentó enviar un correo electrónico sin enviar realmente los correos electrónicos?Ejecución de pruebas de correo electrónico de Junit sin correos electrónicos realmente salientes

Parece que sería un placer tenerlo, pero no estoy seguro de querer escribir el mío. La pila de aplicaciones para el aspecto de envío por correo electrónico es Velocity + Spring, por lo que sería preferible si se puede apuntar al servidor de prueba simplemente cambiando el archivo applicationContext.xml.

+0

Compruebe mi respuesta http://stackoverflow.com/questions/8599791/a-simple-local-smtp-server/22043597#22043597 –

Respuesta

27

Respuesta alternativa: Dumbster es un servidor SMTP falso diseñado para realizar pruebas en contra. Está escrito en Java.

+4

+1 para este enfoque, aunque puede ser más fácil trabajar con SubEthaSMTP que con Dumbster. –

+0

Esto hace exactamente lo que solicité. Voy a usarlo por ahora, probablemente cambie a usar un objeto simulado en algún momento para acelerar la prueba. – stevedbrown

+1

Solo una nota: correr con Dumbster, mi prueba de unidad demora unos 500 ms para iniciar el servidor, enviar un correo electrónico y probar que se envió el correo electrónico. Esto es significativamente mejor que mis pruebas marco de Jersey que tardan años. – stevedbrown

14

Creo que el proyecto Mock JavaMail es lo que desea.

+0

Absolutamente - Nunca burlarse de una tercera parte de interfaz a sí mismo, rara vez vale la pena el tiempo (si lo desea, use PowerMock). Pero en este caso, simplemente coloque Mock JavaMail en su lugar y, por arte de magia, todos sus mensajes se mantendrán en un buzón falso para que pueda examinarlos y reafirmarlos. Simple y eficaz (¡simplemente manténgala fuera de su classpath de producción!) – Phantomwhale

+0

hay un inicio rápido: http://ollivander.franzoni.eu/2011/08/30/mock-javamail-primer/ – jediz

+1

El sitio vinculado está cerrado. – holmis83

0

Mi solución fue envolver el servidor de correo en una clase que toma todas las opciones de configuración y tiene un método send(). En mis pruebas, me burlaba de esta clase y anulaba send() con algo que guarda los parámetros actuales para la afirmación.

Para probar que el servicio de correo sí mismo funciona, envíese un correo localmente. Pruebe hMail si está en Windows.

+0

Desarrollo en Windows, pero ejecuto el servidor de integración continua en Ubuntu, por lo que no funcionará. – stevedbrown

+0

Sure; use la dirección "localhost" o "127.0.0.1" y agregue la misma cuenta en Ubunutu para el correo que en Windows. No estoy seguro de qué usa Ubuntu pero ya tiene un servidor de correo instalado. Probablemente qmail o postfix. –

3

Supongo que está utilizando Javamail y el problema es que javax.mail.Session es final y, por lo tanto, no se puede burlar.

Parece que otros han sugerido que simplemente defina su propia interfaz 'sesión de correo' y cree una implementación que use Javamail. En sus pruebas, simplemente se inyecta un simulacro, mientras que en 'modo mundo real' se inyecta la implementación de Javamail.

Tanto JMock como EasyMock admitirán todas las afirmaciones que desee realizar sobre el mensaje que está enviando y su prueba estará completa.

Como un lado, generalmente trato de evitar las llamadas fuera de proceso desde pruebas unitarias: te mata cuando ejecutas el conjunto de pruebas con frecuencia, lo que normalmente se traduce en que se ejecuta menos y eso es código base problemas comienzan a ocurrir.

+0

Eso es realmente un buen comentario y me hizo pensar en mi enfoque un poco más. Estaba pensando en generar un proceso, pero lo más probable es que creara un bean en mi configuración de primavera que se burla de un servidor de correo electrónico. – stevedbrown

+0

Hola Steve: ese es exactamente el punto. Si tiene otro proceso ejecutándose como su punto final, de repente las afirmaciones se vuelven difíciles, por lo que la prueba termina simplemente asegurándose de no obtener errores del otro proceso, que probablemente no sea el mismo que se usará con ira, así que es realmente una prueba silenciosa; después de todo, creo que es seguro asumir que Javamail funciona ;-) El enfoque burlón te permite validar el contenido del mensaje, que creo que es la prueba real .... –

1

Puede intentar JavaMail Mock2 https://github.com/salyh/javamail-mock2

Su centrado principalmente en IMAP/POP3 SMTP pero Mock también está disponible. Está disponible en maven central.

Características

  • IMAP textuales, imaps, POP3, POP3S, SMTP, SMTPS
  • compatibles para POP3: fundido a POP3Folder, Folder.getUID (msg Mensaje)
  • admite para IMAP: fundido a IMAPFolder, modelado a UIDFolder, subcarpetas, -Folder.getMessagesByUID (...), borrar/renombrar carpetas, adicionar mensajes
  • Soporte para SMTP: Mock Transport.send()
  • no admitida por el momento: extensiones IMAP como IDL E, CONDSTORE, ...y la arroja a POP3Message/IMAPMessage, almacenar oyentes
8

me gustaría echar un vistazo a lo que está vivo greenmail (aparentemente Dumbster está muerto) con una gran cantidad de funcionalidad y buenos ejemplos.

http://www.icegreen.com/greenmail/

Cuestiones relacionadas