2016-07-05 113 views
1

我想在春季测试我的服务,它应该发送电子邮件。 我尝试使用org.subethamail:subethasmtp在春季测试发送邮件

要acieve我的目标,我创建服务MySender在那里我发送电子邮件:

@Autowired 
private MailSender mailSender; 

//... 
    SimpleMailMessage message = new SimpleMailMessage(); 
    message.setTo("[email protected]"); 
    message.setSubject("Subject"); 
    message.setText("Text"); 
    mailSender.send(message); 
// ... 

为了测试这一块我创建的测试application.properties(测试范围)代码:

spring.mail.host=127.0.0.1 
spring.mail.port=${random.int[4000,6000]} 

和测试配置应启动Wiser SMTP服务器并使其在测试中可重复使用的类:

@Configuration 
public class TestConfiguration { 

    @Autowired 
    private Wiser wiser; 

    @Value("${spring.mail.host}") 
    String smtpHost; 

    @Value("${spring.mail.port}") 
    int smtpPort; 

    @Bean 
    public Wiser provideWiser() { 
     // provide wiser for verification in tests 
     Wiser wiser = new Wiser(); 
     return wiser; 
    } 

    @PostConstruct 
    public void initializeMailServer() { 
     // start server 
     wiser.setHostname(smtpHost); 
     wiser.setPort(smtpPort); 
     wiser.start(); 
    } 

    @PreDestroy 
    public void shutdownMailServer() { 
     // stop server 
     wiser.stop(); 
    } 

} 

预期结果是应用程序使用Wiser smtp服务器发送电子邮件并验证发送邮件的数量。

但是当我运行服务应用程序抛出MailSendException(Couldn't connect to host, port: 127.0.0.1, 4688; timeout -1;)。 但是,当我添加断点并尝试连接使用telnet smtp服务器允许连接,并不抛出Connection refused

你知道为什么我无法测试发送邮件吗?

的完整代码预览可以在GitHub上: https://github.com/karolrynio/demo-mail

+0

在猜测,明智的服务器不是测试执行开始时完成。在运行测试之前,您可能需要在'@ Before'中执行某些操作以确保套接字处于活动状态。 – Taylor

+0

我不确定,因为在日志中我有信息,服务器在测试日志之前启动,但我尝试在运行测试之前等待服务器启动。 – krynio

+1

我发现错误。我的问题的原因是配置。 Line:spring.mail.port = $ {random.int [4000,6000]},因为spring将2个不同的值注入到bean中。 Bean MailSender具有与Wiser不同的端口值。谢谢你的帮助。 – krynio

回答

0

在应用程序属性可以还添加

mail.smtp.auth=false 
mail.smtp.starttls.enable=false 

改变你的代码,这些额外的两个值

@Value("${mail.smtp.auth}") 
private boolean auth; 

@Value("${mail.smtp.starttls.enable}") 
private boolean starttls; 

并将这些选项放入您的initializeMailServer中

Properties mailProperties = new Properties(); 
mailProperties.put("mail.smtp.auth", auth); 
mailProperties.put("mail.smtp.starttls.enable", starttls); 
wiser.setJavaMailProperties(mailProperties); 
wiser.setHostname(smtpHost); 
wiser.setPort(smtpPort); 
wiser.start(); 

让我知道如果这个工作对你

+0

我稍后检查。谢谢。 – krynio

+0

它不起作用,但我发现其他库用于测试发送电子邮件,我试了一下。 – krynio

+0

那个库是什么 – rajadilipkolli