Commit a332d5f893dbb04f0d16c10b0d92ec496da5a4dc
1 parent
e7d0b8da
完善 SmsSendServiceImpl 单元测试
Showing
2 changed files
with
102 additions
and
17 deletions
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java
| ... | ... | @@ -66,7 +66,7 @@ public class SmsSendServiceImpl implements SmsSendService { |
| 66 | 66 | } |
| 67 | 67 | } |
| 68 | 68 | // 执行发送 |
| 69 | - return this.sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams); | |
| 69 | + return sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams); | |
| 70 | 70 | } |
| 71 | 71 | |
| 72 | 72 | @Override |
| ... | ... | @@ -76,19 +76,19 @@ public class SmsSendServiceImpl implements SmsSendService { |
| 76 | 76 | mobile = memberService.getMemberUserMobile(userId); |
| 77 | 77 | } |
| 78 | 78 | // 执行发送 |
| 79 | - return this.sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); | |
| 79 | + return sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); | |
| 80 | 80 | } |
| 81 | 81 | |
| 82 | 82 | @Override |
| 83 | 83 | public Long sendSingleSms(String mobile, Long userId, Integer userType, |
| 84 | 84 | String templateCode, Map<String, Object> templateParams) { |
| 85 | 85 | // 校验短信模板是否合法 |
| 86 | - SmsTemplateDO template = this.checkSmsTemplateValid(templateCode); | |
| 86 | + SmsTemplateDO template = validateSmsTemplate(templateCode); | |
| 87 | 87 | // 校验短信渠道是否合法 |
| 88 | - SmsChannelDO smsChannel = this.checkSmsChannelValid(template.getChannelId()); | |
| 88 | + SmsChannelDO smsChannel = validateSmsChannel(template.getChannelId()); | |
| 89 | 89 | |
| 90 | 90 | // 校验手机号码是否存在 |
| 91 | - mobile = this.checkMobile(mobile); | |
| 91 | + mobile = validateMobile(mobile); | |
| 92 | 92 | // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志 |
| 93 | 93 | List<KeyValue<String, Object>> newTemplateParams = this.buildTemplateParams(template, templateParams); |
| 94 | 94 | |
| ... | ... | @@ -108,7 +108,7 @@ public class SmsSendServiceImpl implements SmsSendService { |
| 108 | 108 | } |
| 109 | 109 | |
| 110 | 110 | @VisibleForTesting |
| 111 | - public SmsChannelDO checkSmsChannelValid(Long channelId) { | |
| 111 | + SmsChannelDO validateSmsChannel(Long channelId) { | |
| 112 | 112 | // 获得短信模板。考虑到效率,从缓存中获取 |
| 113 | 113 | SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); |
| 114 | 114 | // 短信模板不存在 |
| ... | ... | @@ -119,7 +119,7 @@ public class SmsSendServiceImpl implements SmsSendService { |
| 119 | 119 | } |
| 120 | 120 | |
| 121 | 121 | @VisibleForTesting |
| 122 | - public SmsTemplateDO checkSmsTemplateValid(String templateCode) { | |
| 122 | + SmsTemplateDO validateSmsTemplate(String templateCode) { | |
| 123 | 123 | // 获得短信模板。考虑到效率,从缓存中获取 |
| 124 | 124 | SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); |
| 125 | 125 | // 短信模板不存在 |
| ... | ... | @@ -139,7 +139,7 @@ public class SmsSendServiceImpl implements SmsSendService { |
| 139 | 139 | * @return 处理后的参数 |
| 140 | 140 | */ |
| 141 | 141 | @VisibleForTesting |
| 142 | - public List<KeyValue<String, Object>> buildTemplateParams(SmsTemplateDO template, Map<String, Object> templateParams) { | |
| 142 | + List<KeyValue<String, Object>> buildTemplateParams(SmsTemplateDO template, Map<String, Object> templateParams) { | |
| 143 | 143 | return template.getParams().stream().map(key -> { |
| 144 | 144 | Object value = templateParams.get(key); |
| 145 | 145 | if (value == null) { |
| ... | ... | @@ -150,7 +150,7 @@ public class SmsSendServiceImpl implements SmsSendService { |
| 150 | 150 | } |
| 151 | 151 | |
| 152 | 152 | @VisibleForTesting |
| 153 | - public String checkMobile(String mobile) { | |
| 153 | + public String validateMobile(String mobile) { | |
| 154 | 154 | if (StrUtil.isEmpty(mobile)) { |
| 155 | 155 | throw exception(SMS_SEND_MOBILE_NOT_EXISTS); |
| 156 | 156 | } | ... | ... |
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java
| 1 | 1 | package cn.iocoder.yudao.module.system.service.sms; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.map.MapUtil; |
| 4 | -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; | |
| 5 | -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; | |
| 6 | -import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; | |
| 7 | -import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; | |
| 8 | 4 | import cn.iocoder.yudao.framework.common.core.KeyValue; |
| 9 | 5 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 10 | 6 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; |
| ... | ... | @@ -14,6 +10,13 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; |
| 14 | 10 | import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; |
| 15 | 11 | import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; |
| 16 | 12 | import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; |
| 13 | +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO; | |
| 14 | +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; | |
| 15 | +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; | |
| 16 | +import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; | |
| 17 | +import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer; | |
| 18 | +import cn.iocoder.yudao.module.system.service.member.MemberService; | |
| 19 | +import cn.iocoder.yudao.module.system.service.user.AdminUserService; | |
| 17 | 20 | import org.assertj.core.util.Lists; |
| 18 | 21 | import org.junit.jupiter.api.Test; |
| 19 | 22 | import org.mockito.InjectMocks; |
| ... | ... | @@ -37,6 +40,10 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { |
| 37 | 40 | private SmsSendServiceImpl smsService; |
| 38 | 41 | |
| 39 | 42 | @Mock |
| 43 | + private AdminUserService adminUserService; | |
| 44 | + @Mock | |
| 45 | + private MemberService memberService; | |
| 46 | + @Mock | |
| 40 | 47 | private SmsChannelService smsChannelService; |
| 41 | 48 | @Mock |
| 42 | 49 | private SmsTemplateService smsTemplateService; |
| ... | ... | @@ -48,6 +55,84 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { |
| 48 | 55 | @Mock |
| 49 | 56 | private SmsClientFactory smsClientFactory; |
| 50 | 57 | |
| 58 | + @Test | |
| 59 | + public void testSendSingleSmsToAdmin() { | |
| 60 | + // 准备参数 | |
| 61 | + Long userId = randomLongId(); | |
| 62 | + String templateCode = randomString(); | |
| 63 | + Map<String, Object> templateParams = MapUtil.<String, Object>builder().put("code", "1234") | |
| 64 | + .put("op", "login").build(); | |
| 65 | + // mock adminUserService 的方法 | |
| 66 | + AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setMobile("15601691300")); | |
| 67 | + when(adminUserService.getUser(eq(userId))).thenReturn(user); | |
| 68 | + | |
| 69 | + // mock SmsTemplateService 的方法 | |
| 70 | + SmsTemplateDO template = randomPojo(SmsTemplateDO.class, o -> { | |
| 71 | + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); | |
| 72 | + o.setContent("验证码为{code}, 操作为{op}"); | |
| 73 | + o.setParams(Lists.newArrayList("code", "op")); | |
| 74 | + }); | |
| 75 | + when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); | |
| 76 | + String content = randomString(); | |
| 77 | + when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) | |
| 78 | + .thenReturn(content); | |
| 79 | + // mock SmsChannelService 的方法 | |
| 80 | + SmsChannelDO smsChannel = randomPojo(SmsChannelDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); | |
| 81 | + when(smsChannelService.getSmsChannel(eq(template.getChannelId()))).thenReturn(smsChannel); | |
| 82 | + // mock SmsLogService 的方法 | |
| 83 | + Long smsLogId = randomLongId(); | |
| 84 | + when(smsLogService.createSmsLog(eq(user.getMobile()), eq(userId), eq(UserTypeEnum.ADMIN.getValue()), eq(Boolean.TRUE), eq(template), | |
| 85 | + eq(content), eq(templateParams))).thenReturn(smsLogId); | |
| 86 | + | |
| 87 | + // 调用 | |
| 88 | + Long resultSmsLogId = smsService.sendSingleSmsToAdmin(null, userId, templateCode, templateParams); | |
| 89 | + // 断言 | |
| 90 | + assertEquals(smsLogId, resultSmsLogId); | |
| 91 | + // 断言调用 | |
| 92 | + verify(smsProducer).sendSmsSendMessage(eq(smsLogId), eq(user.getMobile()), | |
| 93 | + eq(template.getChannelId()), eq(template.getApiTemplateId()), | |
| 94 | + eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login")))); | |
| 95 | + } | |
| 96 | + | |
| 97 | + @Test | |
| 98 | + public void testSendSingleSmsToUser() { | |
| 99 | + // 准备参数 | |
| 100 | + Long userId = randomLongId(); | |
| 101 | + String templateCode = randomString(); | |
| 102 | + Map<String, Object> templateParams = MapUtil.<String, Object>builder().put("code", "1234") | |
| 103 | + .put("op", "login").build(); | |
| 104 | + // mock adminUserService 的方法 | |
| 105 | + String mobile = "15601691300"; | |
| 106 | + when(memberService.getMemberUserMobile(eq(userId))).thenReturn(mobile); | |
| 107 | + | |
| 108 | + // mock SmsTemplateService 的方法 | |
| 109 | + SmsTemplateDO template = randomPojo(SmsTemplateDO.class, o -> { | |
| 110 | + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); | |
| 111 | + o.setContent("验证码为{code}, 操作为{op}"); | |
| 112 | + o.setParams(Lists.newArrayList("code", "op")); | |
| 113 | + }); | |
| 114 | + when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); | |
| 115 | + String content = randomString(); | |
| 116 | + when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) | |
| 117 | + .thenReturn(content); | |
| 118 | + // mock SmsChannelService 的方法 | |
| 119 | + SmsChannelDO smsChannel = randomPojo(SmsChannelDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); | |
| 120 | + when(smsChannelService.getSmsChannel(eq(template.getChannelId()))).thenReturn(smsChannel); | |
| 121 | + // mock SmsLogService 的方法 | |
| 122 | + Long smsLogId = randomLongId(); | |
| 123 | + when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(UserTypeEnum.MEMBER.getValue()), eq(Boolean.TRUE), eq(template), | |
| 124 | + eq(content), eq(templateParams))).thenReturn(smsLogId); | |
| 125 | + | |
| 126 | + // 调用 | |
| 127 | + Long resultSmsLogId = smsService.sendSingleSmsToMember(null, userId, templateCode, templateParams); | |
| 128 | + // 断言 | |
| 129 | + assertEquals(smsLogId, resultSmsLogId); | |
| 130 | + // 断言调用 | |
| 131 | + verify(smsProducer).sendSmsSendMessage(eq(smsLogId), eq(mobile), | |
| 132 | + eq(template.getChannelId()), eq(template.getApiTemplateId()), | |
| 133 | + eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login")))); | |
| 134 | + } | |
| 135 | + | |
| 51 | 136 | /** |
| 52 | 137 | * 发送成功,当短信模板开启时 |
| 53 | 138 | */ |
| ... | ... | @@ -83,7 +168,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { |
| 83 | 168 | // 断言 |
| 84 | 169 | assertEquals(smsLogId, resultSmsLogId); |
| 85 | 170 | // 断言调用 |
| 86 | - verify(smsProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile), | |
| 171 | + verify(smsProducer).sendSmsSendMessage(eq(smsLogId), eq(mobile), | |
| 87 | 172 | eq(template.getChannelId()), eq(template.getApiTemplateId()), |
| 88 | 173 | eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login")))); |
| 89 | 174 | } |
| ... | ... | @@ -134,7 +219,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { |
| 134 | 219 | // mock 方法 |
| 135 | 220 | |
| 136 | 221 | // 调用,并断言异常 |
| 137 | - assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode), | |
| 222 | + assertServiceException(() -> smsService.validateSmsTemplate(templateCode), | |
| 138 | 223 | SMS_SEND_TEMPLATE_NOT_EXISTS); |
| 139 | 224 | } |
| 140 | 225 | |
| ... | ... | @@ -157,7 +242,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { |
| 157 | 242 | // mock 方法 |
| 158 | 243 | |
| 159 | 244 | // 调用,并断言异常 |
| 160 | - assertServiceException(() -> smsService.checkMobile(null), | |
| 245 | + assertServiceException(() -> smsService.validateMobile(null), | |
| 161 | 246 | SMS_SEND_MOBILE_NOT_EXISTS); |
| 162 | 247 | } |
| 163 | 248 | |
| ... | ... | @@ -177,7 +262,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { |
| 177 | 262 | // 调用 |
| 178 | 263 | smsService.doSendSms(message); |
| 179 | 264 | // 断言 |
| 180 | - verify(smsLogService, times(1)).updateSmsSendResult(eq(message.getLogId()), | |
| 265 | + verify(smsLogService).updateSmsSendResult(eq(message.getLogId()), | |
| 181 | 266 | eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()), |
| 182 | 267 | eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo())); |
| 183 | 268 | } | ... | ... |