2012-03-12 1 views
3

Я пытаюсь использовать Greenmail для модульного тестирования функций электронной почты на моем локальном хосте. Проблема в том, что у меня нет уже установленного SMTP-сервера, и он чувствует, что он слишком убивает, чтобы установить его. Я ожидаю, что должна быть свободная библиотека, которая позволяет мне сохранить мой почтовый код одинаковым, но вместо по-настоящему отправки электронной почты на SMTP-сервер отправьте его на мою локальную машину, чтобы я мог их восстановить (ради единицы тестирование).Тестирование Greenmail без установки SMTP-сервера

Я когда-то использовал Greenmail при разработке с Grails, и опыт отличный. Но я не могу найти что-то подобное для Spring Framework. На странице Greenmail говорится, что в JBoss есть насмешливый SMTP-сервер. Но я не хочу запускать JBoss, так как в настоящее время мое веб-приложение работает на Tomcat.

Есть ли аналогичные услуги для Tomcat уже? Или есть лучший способ отправить тестовую электронную почту на localhost, где я могу получить отправленные электронные письма?

UPDATE:

Я попытался с помощью метода Ральфа, но он по-прежнему дает то же исключение:

[SimpleAsyncTaskExecutor-1] 2012-03-13 10:19:39,475 - ERROR: com.test.my.service.emailing.impl.EmailServiceImpl - Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect 
org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect; message exception details (1) are: 
Failed message 1: 
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412) 
    at javax.mail.Service.connect(Service.java:288) 
    at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389) 
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340) 
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:336) 
    at com.test.my.service.emailing.impl.EmailServiceImpl.test(EmailServiceImpl.java:388) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:80) 
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.net.ConnectException: Connection refused: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(Unknown Source) 
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:233) 
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:189) 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1359) 
    ... 19 more 

ответ

8

Вы можете использовать Greenmail с любой программой Java, независимо от того, если она использует Spring или не. Для этого вам не нужны какие-нибудь весенние вещи.

Он запускает какой-то процесс почтового сервера.

import com.icegreen.greenmail.util.GreenMail; 
import com.icegreen.greenmail.util.GreenMailUtil; 
import com.icegreen.greenmail.util.ServerSetupTest; ... 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("ApplicationContext-Greenmail.xml") 
public class EmailServiceIntegrationTest { 

    /** Class under test */ 
    @Resource 
    private EmailService emailService; 

    private GreenMail greenMail; 

    @Before 
    public void startMailServer() { 
     greenMail = new GreenMail(ServerSetupTest.SMTP); 
     greenMail.start(); 
    } 

    @After 
    public void stopMailServer() { 
     greenMail.stop(); 
    } 

    @Test 
    public void testPledgeReminder() 
       throws InterruptedException, MessagingException { 

     String mailText = "Hallo World"; 
     String mailSubject = "Hallo"; 
     String mailTo = "[email protected]"; 

     /** when: sending a mail */ 
     emailService.send(mailSubject, mailTo, mailText); 

     assertTrue(greenMail.waitForIncomingEmail(5000, 1)); 
     Message[] messages = greenMail.getReceivedMessages(); 
     assertEquals(1, messages.length); 
     assertEquals(mailText, messages[0].getSubject());  
     String body = GreenMailUtil.getBody(messages[0]).replaceAll("=\r?\n", ""); 
     assertEquals(mailText, body);  
    } 

} 

важно: использовать порт 3025

<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="javaMailProperties"> 
     <util:properties> 
      <prop key="mail.debug">false</prop> 
      <prop key="mail.transport.protocol">smtp</prop> 
      <prop key="mail.smtp.port">3025</prop> 
      <prop key="mail.smtp.auth">true</prop> 
      <prop key="mail.smtp.user">[email protected]</prop> 
      <prop key="mail.smtp.host">localhost</prop> 
      <prop key="mail.smtp.from">[email protected]</prop> 
     </util:properties> 
    </property> 
    <property name="username" value="test"/> 
    <property name="password" value="xxx"/> 
    <property name="defaultEncoding" value="utf8" /> 
</bean> 

Затем эта конфигурация будет настроить Spring JavaMailSender отправить свои письма на шантаже-сервер начал и закончил с помощью тестового кода.

+0

используя порт 3025? Я не слышал об этом ни слова об этом, но, похоже, стоит попробовать –

+0

, пожалуйста, посмотрите мое обновление в вопросе. Я не могу сделать эту работу –

+0

Кажется, что есть проблема с моим брандмауэром. Сейчас я работаю нормально. Спасибо за поддержку! –

0

кажется, что кто-то когда-то предложил такой интеграции: http://sourceforge.net/mailarchive/forum.php?thread_name=45DEB9E3.6090608%40consol.de&forum_name=greenmail-developers

Не знаю, если он все еще работает ...

+0

Спасибо, но вы, кажется, неправильно понимаете, что мне нужно. Я хочу использовать JavaMail, но как-то настроить почтовую почту для получения электронной почты. Таким образом, мне не нужно менять код взад и вперед (переключение для класса Greenmail при тестировании и переход на JavaMail для отправки настоящих электронных писем в процессе производства) –

2

Edit (+2017 ноября):

Dumbster ссылка мертва, есть развилка его на GitHub https://github.com/kirviq/dumbster

---- Исходное сообщение ----

Посмотрите Dumbster - Я использую его для всех своих модульных тестов, так как это позволяет мне утверждать против фактических отправленных электронных писем.

http://quintanasoft.com/dumbster/

+1

Я бы предпочел использовать Greenmail, так как у меня был хороший опыт работы с ним в Grails. Но если что-то не сработает, я дам Дамстеру попытку. Благодаря! –

0

Делая какие-нибудь подобное в тесте spring отлично работает для меня:

ServerSetupTest.setPortOffset(<SOME_CUSTOM_PORT>); 
testEmailServer = new GreenMail(); 
testEmailServer.start(); 

Основная идея ServerSetupTest класса является создание ServerSetup с определенного пользователем порта смещения для тестирования , Дополнительную информацию см. В разделе docs.

0

Попробуйте установить порт шантаж сервера вручную, как это:

@Before 
public void startMailServer() 
    throws Exception 
{ 
    ServerSetup setup = new ServerSetup(3025,"localhost","smtp"); 
    greenMail = new GreenMail(setup); 
    greenMail.start(); 
} 

, а затем установить порт вашего почтового отправителя такие же, как указано выше, обратите внимание на протокол/хост/порт:

email.protocol=smtp 
email.host=localhost 
email.port=3025 
[email protected] 
[email protected] 
email.auth=true 
[email protected] 

с фасоль:

<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="protocol" value="${email.protocol}" /> 
    <property name="host" value="${email.host}" /> 
    <property name="port" value="${email.port}" /> 
    <property name="username" value="${email.username}" /> 
    <property name="password" value="${email.password}" /> 
    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.${email.protocol}.auth">${email.auth}</prop> 
     </props> 
    </property> 
</bean>