如何使用MockitoJUnitRunner在此方法中模拟Transport.send()方法?

时间:2019-07-26 10:54:57

标签: mockito javamail junit4

我想为给定方法编写测试用例。但是存在一个静态的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);
    }

1 个答案:

答案 0 :(得分:1)

所以:

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

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

选项:

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

最后一个想法有多种口味:

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