首页 > 解决方案 > 如何使用 MockitoJUnitRunner 在此方法中模拟 Transport.send() 方法?

问题描述

我想为给定的方法编写测试用例。但是存在一个静态 Transport.sendEmail 方法。

如何使用 MockitoJunitRunner 模拟此方法。

public void sendEmail(final String message, final String contentType) {

    final Session session = Session.getDefaultInstance(PROPERTIES, null);
    final Multipart mpart = new MimeMultipart();

    final MimeBodyPart body = new MimeBodyPart();

    try {
        body.setContent(message, contentType);
        mpart.addBodyPart(body);
        Transport.send(createMessage(session, mpart));

        LOGGER.info("Email Notification Sent Successfully");
    } catch (MessagingException | UnsupportedEncodingException e) {
        LOGGER.error("Was not able to send mail", e);
    }

标签: mockitojakarta-mailjunit4

解决方案


所以:

Transport.send(createMessage(session, mpart));

static调用意味着:您无法使用 Mockito 来“控制”它。干净利落。如果该调用只是在您的单元测试环境中“通过”,那么您可以对其进行测试,但不能验证该调用是否确实发生了。更糟糕的是,如果该调用在单元测试设置中引发了一些异常,那么见鬼,你能做什么?

选项:

  • 转向 PowerMock(ito) 或 JMockit,因为它们可以让您获得控制权
  • 推荐:改进您的设计,使其易于测试

最后一个想法有多种形式:

  • 例如,您可以创建一个EmailSenderService提供void send(Message whatever)方法的最小接口。接下来:您创建该接口的一个实现,该实现仅调用该静态方法。现在,您实际上必须发送该消息的代码......只需在EmailSenderService. 在您的单元测试中,您现在可以@Mock 该界面,并且您可以控制它。
  • 或者,您只需弃用该静态方法(可能是整个类),然后设计一个不依赖静态方法的新“真实”EmailSenderService。

推荐阅读