背景
Mock测试就是在测试某个方法的时候避免去构建全部的依赖,而是通过Mock去模拟这些依赖,通过自定义依赖的返回结果,从而更专注的去测试这个方法本身,如下图所示。
下面以发送邮件的业务代码为例。
一、单元测试
将发送业务代码直接嵌入测试类,模拟调用
public class BaseNoticeHandlerServiceImplTest {
private static final Logger log = LoggerFactory.getLogger(BaseNoticeHandlerServiceImplTest.class);
void sendMail(MailBo mail) throws Exception {
JSONObject responseBody = new JSONObject();
responseBody.put("code", 200);
responseBody.put("message", "邮件发送成功");
try {
Integer code = responseBody.getInteger("code");
if (code == ResultCode.SUCCESS.getCode()) {
log.info(responseBody.toString());
} else {
throw new ServiceException(responseBody.toString());
}
} catch (FeignException fe) {
log.error("邮件发送服务出错:{}", fe.getMessage(), fe);
throw fe;
} catch (Exception e) {
log.error("邮件发送出错:{}", e.getMessage());
throw e;
}
log.info("业务类型:{}, 发件人昵称:{}, 收件人:{}, 抄送人:{}, 邮件主题:{}", mail.getBizType(), mail.getNickName(), mail.getSendTo(), mail.getSendCopyTo(), mail.getSubject());
}
@Test
void messenger() {
List<String> sendTo = Lists.newArrayList("001@qq.com");
MailBo mail = new MailBo();
mail.setBizType(1);
mail.setNickName("test");
mail.setSendTo(sendTo);
mail.setSubject("接口测试");
mail.setText("测试messenger服务邮件接口");
try {
this.sendMail(mail);
} catch (Exception e) {
log.error("发送失败", e);
}
}
}
二、手动创建依赖实例
public class BaseNoticeHandlerServiceImplTest {
private static final Logger log = LoggerFactory.getLogger(BaseNoticeHandlerServiceImplTest.class);
private BaseNoticeHandlerServiceImpl baseNoticeHandlerService;
public BaseNoticeHandlerServiceImplTest() {
this.baseNoticeHandlerService = new BaseNoticeHandlerServiceImpl();
}
@Test
void messenger() {
List<String> sendTo = Lists.newArrayList("001@qq.com");
MailBo mail = new MailBo();
mail.setBizType(1);
mail.setNickName("test");
mail.setSendTo(sendTo);
mail.setSubject("接口测试");
mail.setText("测试messenger服务邮件接口");
try {
baseNoticeHandlerService.sendEmail(mail);
} catch (Exception e) {
log.error("发送失败", e);
}
}
}