我想在我的代码中测试SendMail函数。如何模拟会话,属性,Mime消息?
我正在使用SMTP发送邮件。
JsonObject sendMail()
{
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
});
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("xyz");
message.setText("sjs");
Transport.send(message);
}catch (Exception e)
{
String response = new String("{"status":"failed"}");
return response;
}
String response = new String("{"status":"sent successfully"}");
return response;
}
答案并不那么简单,因为您使用会话和传输类的静态方法。通过使用静态方法,不可能注入不同的模拟对象,因为模拟需要一个实例。
当然有一个解决方案,但它实际上是最后的手段:使用PowerMock(ito(。它使您能够模拟静态方法。但是PowerMock存在一些问题:它不支持JUnit5,不支持Java 11,测试不是由SonarQube测量的。另外:你需要PowerMock的事实实际上告诉你,你需要重写你的代码,以便它是可测试的。
可测试代码使用依赖注入框架(例如Spring(在类中动态插入正确的对象。这个功能很酷的地方是,你可以在测试类时注入 Mock 对象。