mockito - 如何使用 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);
}
解决方案
所以:
Transport.send(createMessage(session, mpart));
该static
调用意味着:您无法使用 Mockito 来“控制”它。干净利落。如果该调用只是在您的单元测试环境中“通过”,那么您可以对其进行测试,但不能验证该调用是否确实发生了。更糟糕的是,如果该调用在单元测试设置中引发了一些异常,那么见鬼,你能做什么?
选项:
- 转向 PowerMock(ito) 或 JMockit,因为它们可以让您获得控制权
- 推荐:改进您的设计,使其易于测试
最后一个想法有多种形式:
- 例如,您可以创建一个
EmailSenderService
提供void send(Message whatever)
方法的最小接口。接下来:您创建该接口的一个实现,该实现仅调用该静态方法。现在,您实际上必须发送该消息的代码......只需在EmailSenderService
. 在您的单元测试中,您现在可以@Mock 该界面,并且您可以控制它。 - 或者,您只需弃用该静态方法(可能是整个类),然后设计一个不依赖静态方法的新“真实”EmailSenderService。
推荐阅读
- python-3.x - 使用 Python 3 推导遍历列表中 dicts 中的项目
- javascript - 如何在 React 中编写通过 useCallback 优化的 onClick(带参数)?
- python - 如何比较 Python 中的 Fraction 对象?
- php - 如何通过传递字符串的php数组来进行postgresql查询,用双引号欺骗?
- javascript - Cypress 遍历表格并单击从 gherkin 文件传递的匹配文本
- ios - iOS UITests 通过 Xcode 但因 xcodebuild 失败
- c# - 如何退出 C# GraphQL 订阅?
- python - 如何在python中检查另一个列表中的列表
- reactjs - 如何处理循环中的复选框反应原生
- python - 将 CSV 文件迁移到 Django SQL 后端的最佳方法?