使用 SMTP 为 SendMail 函数编写单元测试



我想在我的代码中测试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 对象。

相关内容

  • 没有找到相关文章

最新更新