Как мне протестировать мой класс, который отправляет электронные письма? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть класс вроде:

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()? У него есть много переменных, которые объявлены внутри метода, и я не могу высмеять их из тестового класса: / Я высмеял все другие методы, потому что они были проще, но этот метод меня смущает. Или я плохо сконструировал этот класс, который не допускает гибкости для модульного тестирования?

1 Ответ

0 голосов
/ 12 марта 2020

Сервис в настоящее время не тестируется на единицу. Я бы порекомендовал:

  • Извлечение свойств Spring в отдельный класс с помощью @ConfigurationProperties.
  • Автоматическое связывание всех классов, от которых вы зависите, вместо получения их экземпляров в самом методе. (Упомянутая конфигурация, Session, Transport et c. - Spring также должен иметь встроенную поддержку для отправки электронных писем , так что, возможно, вы можете упростить свою жизнь.)
  • Используйте внедрение конструктора вместо внедрения поля.

После этого вы сможете создать StarshipEmailSender со всеми необходимыми зависимостями (действительными или фиктивными) и протестировать поведение.

...