Junit测试电子邮件服务

时间:2019-06-14 10:46:51

标签: java spring-boot email junit javamail

我想测试一种使用smtp.gmail.com发送电子邮件的简单方法。发送电子邮件和密码的人在application.properties中设置,并且正在使用@Value注释进行使用。我该如何为这种方法编写Junit测试?

我尝试使用伪造的smtp和绿色邮件。但是我不明白它是如何工作的以及如何实现的。我正在使用gradle。我已经将伪造的smtp包含在build.gradle中,但不知道如何更改电子邮件的发送位置。

这是我的Junit测试课程:

 import static org.junit.Assert.*;

 import javax.mail.MessagingException;
 import javax.mail.internet.AddressException;

 import org.junit.Test;

 import com.Email.EmailServiceApplication;

 public class EmailServiceTest {

    @Test
    public void test() throws AddressException, MessagingException {

        EmailServiceApplication esa = new EmailServiceApplication();
        assertEquals(esa.sendEmail("abhi", 1), "Email sent successfully");
    }

}

这是我的方法

private void sendmail(EmailMessage emailmessage, int ver) throws AddressException, MessagingException {
    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.ssl.trust", "smtp.gmail.com");     
    props.put("mail.smtp.starttls.enable", "true");     
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.port", "587");

    // get session for email
    Session session = Session.getInstance(props, 
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }           
    });

    if(ver == 1) {
        Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(username, false));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(emailmessage.getTo_address()));
        msg.setSubject("Job uploaded");
        BodyPart messageBodyPart = new MimeBodyPart();
        messageBodyPart.setText("job has been uploaded successfully!");        
        Multipart multipart = new MimeMultipart();
        // Set text message part
        multipart.addBodyPart(messageBodyPart);
        // Send the complete message parts
        msg.setContent(multipart);
        msg.setSentDate(new Date());
        // Send
        Transport.send(msg);
    }
}

1 个答案:

答案 0 :(得分:0)

在当前状态下,由于电子邮件提供程序和sendlogic的设置采用相同的方法,因此您的代码难以测试。这样就无法将电子邮件发送到smtp.gmail.com以外的其他位置。

我建议将这两个方面分成一些较小的方法。这使得可以通过例如Greenmail邮件提供商。

类似的东西:

Session createMailSession() {
    ... your original session creation logic here
    return session;
}

void doSendMail(Session session, EmailMessage emailMessage, int ver) {
    if(ver == 1) {
        ... your original sending logic here
    }
}

public void sendMail(EmailMessage emailmessage, int ver) {
  doSendMail(getSession(), emailMessage, ver);
}

现在,您可以使用其他电子邮件提供商来测试发送逻辑,例如绿色邮件:

@Test
public void canSendMail() {
   Session testSession = greenMail.getSmtp().createSession()
   doSendMail(testSession, ..., ...)
   assertEquals(1, greenMail.getReceivedMessages().length)
}