gpt4 book ai didi

java - 如何对发送电子邮件的类进行单元测试?

转载 作者:行者123 更新时间:2023-12-01 18:00:24 25 4
gpt4 key购买 nike

我有一个类:

public class StarshipEmailSender {

@Value("${email.from-email-address:}")
String from;

@Value("${email.from-name:}")
private String fromName;

@Value("${email.smtp.credentials-path:}")
String credentialPath;

@Value("${email.smtp.host:}")
String smtpHost;

@Value("${email.smtp.port:587}")
private int smtpPort;

@Autowired
private AClientFactory clientFactory;

private Properties sessionProperties;
private String smtpUsername = null;
private String smtpPassword = null;

public StarshipEmailSender() {
sessionProperties = new Properties();
sessionProperties.put("mail.transport.protocol", "smtp");
sessionProperties.put("mail.smtp.port", smtpPort);
sessionProperties.put("mail.smtp.starttls.enable", "true");
sessionProperties.put("mail.smtp.auth", "true");
}


public void sendMail(List<String> to, String subject, String contentType, String body)
throws MessagingException, UnsupportedEncodingException {

Session session = Session.getDefaultInstance(sessionProperties);
MimeMessage msg = contructMIMEMessage(session, to, subject, contentType, body);
Transport transport = session.getTransport();
try {
long start = System.currentTimeMillis();

transport.connect(smtpHost, smtpPort, smtpUsername, smtpPassword);
transport.sendMessage(msg, msg.getAllRecipients());
log.info("Email sent to : " + to + " in " + (System.currentTimeMillis()-start) + " millis");
} finally {
transport.close();
}
}


MimeMessage contructMIMEMessage(Session session, List<String> to, String subject, String contentType,
String body) throws UnsupportedEncodingException, MessagingException {
// code to construct a mime message ...
}


}

如何对 sendMail() 方法进行单元测试?它有很多在方法内部声明的变量,我无法从测试类中模拟它们:/我已经模拟了所有其他方法,因为它们更容易,但这个方法让我感到困惑。或者我是否以一种糟糕的方式构建了这个类,不允许单元测试的灵 active ?

最佳答案

该服务当前不可进行单元测试。我建议:

  • 使用 @ConfigurationProperties 将 Spring 属性提取到单独的类。
  • Autowiring 您依赖的所有类,而不是在方法本身中获取它们的实例。 (提到的配置,SessionTransport 等 - Spring 还应该有一个 built-in support for sending emails 所以也许你可以让你的生活更轻松。)
  • 使用构造函数注入(inject)而不是字段注入(inject)。

之后,您应该能够使用所有必要的依赖项(真实的或模拟的)构建您的 StarshipEmailSender 并测试其行为。

关于java - 如何对发送电子邮件的类进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60645400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com