【发布时间】:2016-07-05 19:28:50
【问题描述】:
我想在春季测试我应该发送电子邮件的服务。
我尝试使用org.subethamail:subethasmtp。
为了实现我的目标,我创建了服务MySender 我发送电子邮件:
@Autowired
private MailSender mailSender;
//...
SimpleMailMessage message = new SimpleMailMessage();
message.setTo("example@example.com");
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
【问题讨论】:
-
在测试执行时,聪明的服务器还没有完成启动。在运行测试之前,您可能需要在
@Before中执行某些操作以确保套接字处于活动状态。 -
我不确定,因为在日志中我有信息表明服务器在测试日志之前启动,但我尝试在运行测试之前等待服务器启动。
-
我发现了错误。我的问题的原因是配置。行:spring.mail.port=${random.int[4000,6000]},因为 spring 向 bean 注入了 2 个不同的值。 Bean MailSender 的端口值与 Wiser 不同。感谢您的帮助。
标签: spring spring-boot automated-tests integration-testing