通过 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更具体的设置。