【问题标题】:Email Sending Integration Test电子邮件发送集成测试
【发布时间】:2016-06-29 22:15:34
【问题描述】:

请帮我写一个用于发送电子邮件的集成测试,即 inreal 发送电子邮件。

public interface MailSenderService {

void sendEmail(String to, String from, String subject, String body); }

邮件发送者类

@Service
public class MailSenderServiceImpl implements MailSenderService {
private static final Logger logger = LoggerFactory.getLogger(MailSenderServiceImpl.class);

@Autowired
private JavaMailSender javaMailSender;

@Autowired
Configuration freemarkerConfiguration;

private SimpleMailMessage composeMail(String to, String from, String subject, String body) {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setFrom(from);
    message.setTo(to);
    message.setSubject(subject);
    message.setText(body);
    return message;
}

@Override
public void sendEmail(String to, String from, String subject, String body) {
    sendMessage(composeMail(to, from, subject, body));
}

@Async
private void sendMessage(SimpleMailMessage message) {
    Assert.notNull(javaMailSender, "Email Sender must not be null");
    javaMailSender.send(message);
}}

最后是一个集成测试,没有通过:

public class MailSenderServiceIT extends BaseServiceIntegrationTest {

@Autowired
private MailSenderService mailSenderService;

@Test
public void sendEmail() {
    mailSenderService.sendEmail("test1@gmail.com", "test2@gmail.com", "Test Subject",
            "Test Body");
    flushAndClear();
}

【问题讨论】:

    标签: java spring email integration-testing


    【解决方案1】:

    我们需要知道如何配置您的 JavaMailSender。如果您想在集成测试中发送电子邮件,则需要配置 JavaMailSender 以使用本地配置。以 localhost:5555 为例:

    JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
    javaMailSender.setHost("localhost");
    javaMailSender.setPort(5555);
    

    然后,您可以在测试中直接使用库 subethasmtp 创建服务器 SMTP。我个人创建了一个 Junit 规则来做到这一点:

    public class SMTPServerRule extends ExternalResource {
    
        private Wiser wiser;
        private String hostname;
        private int port;
    
        public SMTPServerRule() {
            this(25);
        }
    
        public SMTPServerRule(int port) {
            this("localhost", port);
        }
    
        public SMTPServerRule(String hostname, int port) {
            this.hostname = hostname;
            this.port = port;
        }
    
    
        @Override
        protected void before() throws Throwable {
            super.before();
    
            wiser = new Wiser(port);
            wiser.setHostname(hostname);
            wiser.start();
        }
    
        public List<WiserMessage> getMessages() {
            return wiser.getMessages();
        }
    
        @Override
        protected void after() {
            super.after();
            wiser.stop();
        }
    }
    

    所以,您可以在集成测试中执行类似的操作:

    @Rule
    public SMTPServerRule smtpServerRule = new SMTPServerRule("localhost", 5555);
    
    @Test
    public void sendEmail() {
        mailSenderService.sendEmail("test1@gmail.com", "test2@gmail.com", "Test Subject", "Test Body");
        flushAndClear();
    
        List<WiserMessage> messages smtpServerRule.getMessages();
    }
    

    【讨论】:

    • 我使用这些属性发送邮件:smtp.host=smtp.gmail.com smtp.port=587 smtp.username=example@gmail.com smtp.password=aaa12345678$
    • 运行测试我得到 MailAuthenticationException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多