通过 Greenmail 进行 Spring Boot 测试
Springboot Testing via Greenmail
我试图在我的 Spring-应用程序中测试我的 Gmail smtp 并遵循此 Tutorial。我已经按照教程中的说明实现了它,但是我的 EmailService 抛出了 MailSendException:
org.springframework.mail.MailSendException: Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 2525; timeout 5000;
nested exception is:
java.net.ConnectException: Connection refused: connect. Failed messages: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 2525; timeout 5000;
nested exception is:
java.net.ConnectException: Connection refused: connect
; message exception details (1) are:
Failed message 1:
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 2525; timeout 5000;
nested exception is:
java.net.ConnectException: Connection refused: connect
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2210)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:722)
at javax.mail.Service.connect(Service.java:342)
有人知道如何解决这个问题吗? (从未测试过 SMTP/Email 之类的东西,因此只是按照上面的教程进行操作。
编辑:我可以手动发送电子邮件而没有任何问题,但我需要对其进行测试。
我的 application.yml:
spring.mail.host: smtp.gmail.com
spring.mail.port: 587
spring.mail.properties.mail.smtp.starttls.enable: true
spring.mail.username: ************@gmail.com
spring.mail.password: ***************
spring.mail.properties.mail.smtp.starttls.required: true
spring.mail.properties.mail.smtp.auth: true
spring.mail.properties.mail.smtp.connectiontimeout: 5000
spring.mail.properties.mail.smtp.timeout: 5000
spring.mail.properties.mail.smtp.writetimeout: 5000
从日志中您可以看到,Spring 正在尝试连接到端口 2525 但无法建立连接。这意味着在测试执行期间,此端口上没有 运行 邮件服务器 - 这应该由 JUnit 规则实现提供(如果您使用的是 JUnit5,请使用 Extensions)
确保您的测试配置设置正确。也就是说,检查你的测试代码,例如
@Rule
public SmtpServerRule smtpServerRule = new SmtpServerRule(2525);
匹配
src/test/resources/application.yml
spring:
mail:
default-encoding: UTF-8
host: localhost
jndi-name:
username: username
password: secret
port: 2525
properties:
mail:
debug: false
smtp:
debug: false
auth: true
starttls: true
protocol: smtp
test-connection: false
我还建议更新 Tutorial 中的代码并添加测试用户 - 因为它可以与安全协议一起使用。
public class SmtpServerRule extends ExternalResource {
// omitted for brevity
@Override
protected void before() throws Throwable {
super.before();
smtpServer = new GreenMail(new ServerSetup(port, null, "smtp"));
smtpServer.addUser("username", "secret");
smtpServer.start();
}
// omitted for brevity
}
另外,参考官方GreenMail documentation更具体的设置。
我试图在我的 Spring-应用程序中测试我的 Gmail smtp 并遵循此 Tutorial。我已经按照教程中的说明实现了它,但是我的 EmailService 抛出了 MailSendException:
org.springframework.mail.MailSendException: Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 2525; timeout 5000;
nested exception is:
java.net.ConnectException: Connection refused: connect. Failed messages: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 2525; timeout 5000;
nested exception is:
java.net.ConnectException: Connection refused: connect
; message exception details (1) are:
Failed message 1:
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 2525; timeout 5000;
nested exception is:
java.net.ConnectException: Connection refused: connect
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2210)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:722)
at javax.mail.Service.connect(Service.java:342)
有人知道如何解决这个问题吗? (从未测试过 SMTP/Email 之类的东西,因此只是按照上面的教程进行操作。 编辑:我可以手动发送电子邮件而没有任何问题,但我需要对其进行测试。 我的 application.yml:
spring.mail.host: smtp.gmail.com
spring.mail.port: 587
spring.mail.properties.mail.smtp.starttls.enable: true
spring.mail.username: ************@gmail.com
spring.mail.password: ***************
spring.mail.properties.mail.smtp.starttls.required: true
spring.mail.properties.mail.smtp.auth: true
spring.mail.properties.mail.smtp.connectiontimeout: 5000
spring.mail.properties.mail.smtp.timeout: 5000
spring.mail.properties.mail.smtp.writetimeout: 5000
从日志中您可以看到,Spring 正在尝试连接到端口 2525 但无法建立连接。这意味着在测试执行期间,此端口上没有 运行 邮件服务器 - 这应该由 JUnit 规则实现提供(如果您使用的是 JUnit5,请使用 Extensions)
确保您的测试配置设置正确。也就是说,检查你的测试代码,例如
@Rule
public SmtpServerRule smtpServerRule = new SmtpServerRule(2525);
匹配
src/test/resources/application.yml
spring:
mail:
default-encoding: UTF-8
host: localhost
jndi-name:
username: username
password: secret
port: 2525
properties:
mail:
debug: false
smtp:
debug: false
auth: true
starttls: true
protocol: smtp
test-connection: false
我还建议更新 Tutorial 中的代码并添加测试用户 - 因为它可以与安全协议一起使用。
public class SmtpServerRule extends ExternalResource {
// omitted for brevity
@Override
protected void before() throws Throwable {
super.before();
smtpServer = new GreenMail(new ServerSetup(port, null, "smtp"));
smtpServer.addUser("username", "secret");
smtpServer.start();
}
// omitted for brevity
}
另外,参考官方GreenMail documentation更具体的设置。