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,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 | @Override | 72 | @Override |
| @@ -76,19 +76,19 @@ public class SmsSendServiceImpl implements SmsSendService { | @@ -76,19 +76,19 @@ public class SmsSendServiceImpl implements SmsSendService { | ||
| 76 | mobile = memberService.getMemberUserMobile(userId); | 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 | @Override | 82 | @Override |
| 83 | public Long sendSingleSms(String mobile, Long userId, Integer userType, | 83 | public Long sendSingleSms(String mobile, Long userId, Integer userType, |
| 84 | String templateCode, Map<String, Object> templateParams) { | 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 | List<KeyValue<String, Object>> newTemplateParams = this.buildTemplateParams(template, templateParams); | 93 | List<KeyValue<String, Object>> newTemplateParams = this.buildTemplateParams(template, templateParams); |
| 94 | 94 | ||
| @@ -108,7 +108,7 @@ public class SmsSendServiceImpl implements SmsSendService { | @@ -108,7 +108,7 @@ public class SmsSendServiceImpl implements SmsSendService { | ||
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | @VisibleForTesting | 110 | @VisibleForTesting |
| 111 | - public SmsChannelDO checkSmsChannelValid(Long channelId) { | 111 | + SmsChannelDO validateSmsChannel(Long channelId) { |
| 112 | // 获得短信模板。考虑到效率,从缓存中获取 | 112 | // 获得短信模板。考虑到效率,从缓存中获取 |
| 113 | SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); | 113 | SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); |
| 114 | // 短信模板不存在 | 114 | // 短信模板不存在 |
| @@ -119,7 +119,7 @@ public class SmsSendServiceImpl implements SmsSendService { | @@ -119,7 +119,7 @@ public class SmsSendServiceImpl implements SmsSendService { | ||
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | @VisibleForTesting | 121 | @VisibleForTesting |
| 122 | - public SmsTemplateDO checkSmsTemplateValid(String templateCode) { | 122 | + SmsTemplateDO validateSmsTemplate(String templateCode) { |
| 123 | // 获得短信模板。考虑到效率,从缓存中获取 | 123 | // 获得短信模板。考虑到效率,从缓存中获取 |
| 124 | SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); | 124 | SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); |
| 125 | // 短信模板不存在 | 125 | // 短信模板不存在 |
| @@ -139,7 +139,7 @@ public class SmsSendServiceImpl implements SmsSendService { | @@ -139,7 +139,7 @@ public class SmsSendServiceImpl implements SmsSendService { | ||
| 139 | * @return 处理后的参数 | 139 | * @return 处理后的参数 |
| 140 | */ | 140 | */ |
| 141 | @VisibleForTesting | 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 | return template.getParams().stream().map(key -> { | 143 | return template.getParams().stream().map(key -> { |
| 144 | Object value = templateParams.get(key); | 144 | Object value = templateParams.get(key); |
| 145 | if (value == null) { | 145 | if (value == null) { |
| @@ -150,7 +150,7 @@ public class SmsSendServiceImpl implements SmsSendService { | @@ -150,7 +150,7 @@ public class SmsSendServiceImpl implements SmsSendService { | ||
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | @VisibleForTesting | 152 | @VisibleForTesting |
| 153 | - public String checkMobile(String mobile) { | 153 | + public String validateMobile(String mobile) { |
| 154 | if (StrUtil.isEmpty(mobile)) { | 154 | if (StrUtil.isEmpty(mobile)) { |
| 155 | throw exception(SMS_SEND_MOBILE_NOT_EXISTS); | 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 | package cn.iocoder.yudao.module.system.service.sms; | 1 | package cn.iocoder.yudao.module.system.service.sms; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.map.MapUtil; | 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 | import cn.iocoder.yudao.framework.common.core.KeyValue; | 4 | import cn.iocoder.yudao.framework.common.core.KeyValue; |
| 9 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 5 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 10 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | 6 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; |
| @@ -14,6 +10,13 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; | @@ -14,6 +10,13 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult; | ||
| 14 | import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; | 10 | import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO; |
| 15 | import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; | 11 | import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO; |
| 16 | import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; | 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 | import org.assertj.core.util.Lists; | 20 | import org.assertj.core.util.Lists; |
| 18 | import org.junit.jupiter.api.Test; | 21 | import org.junit.jupiter.api.Test; |
| 19 | import org.mockito.InjectMocks; | 22 | import org.mockito.InjectMocks; |
| @@ -37,6 +40,10 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | @@ -37,6 +40,10 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | ||
| 37 | private SmsSendServiceImpl smsService; | 40 | private SmsSendServiceImpl smsService; |
| 38 | 41 | ||
| 39 | @Mock | 42 | @Mock |
| 43 | + private AdminUserService adminUserService; | ||
| 44 | + @Mock | ||
| 45 | + private MemberService memberService; | ||
| 46 | + @Mock | ||
| 40 | private SmsChannelService smsChannelService; | 47 | private SmsChannelService smsChannelService; |
| 41 | @Mock | 48 | @Mock |
| 42 | private SmsTemplateService smsTemplateService; | 49 | private SmsTemplateService smsTemplateService; |
| @@ -48,6 +55,84 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | @@ -48,6 +55,84 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | ||
| 48 | @Mock | 55 | @Mock |
| 49 | private SmsClientFactory smsClientFactory; | 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,7 +168,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | ||
| 83 | // 断言 | 168 | // 断言 |
| 84 | assertEquals(smsLogId, resultSmsLogId); | 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 | eq(template.getChannelId()), eq(template.getApiTemplateId()), | 172 | eq(template.getChannelId()), eq(template.getApiTemplateId()), |
| 88 | eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login")))); | 173 | eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login")))); |
| 89 | } | 174 | } |
| @@ -134,7 +219,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | @@ -134,7 +219,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | ||
| 134 | // mock 方法 | 219 | // mock 方法 |
| 135 | 220 | ||
| 136 | // 调用,并断言异常 | 221 | // 调用,并断言异常 |
| 137 | - assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode), | 222 | + assertServiceException(() -> smsService.validateSmsTemplate(templateCode), |
| 138 | SMS_SEND_TEMPLATE_NOT_EXISTS); | 223 | SMS_SEND_TEMPLATE_NOT_EXISTS); |
| 139 | } | 224 | } |
| 140 | 225 | ||
| @@ -157,7 +242,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | @@ -157,7 +242,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | ||
| 157 | // mock 方法 | 242 | // mock 方法 |
| 158 | 243 | ||
| 159 | // 调用,并断言异常 | 244 | // 调用,并断言异常 |
| 160 | - assertServiceException(() -> smsService.checkMobile(null), | 245 | + assertServiceException(() -> smsService.validateMobile(null), |
| 161 | SMS_SEND_MOBILE_NOT_EXISTS); | 246 | SMS_SEND_MOBILE_NOT_EXISTS); |
| 162 | } | 247 | } |
| 163 | 248 | ||
| @@ -177,7 +262,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | @@ -177,7 +262,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest { | ||
| 177 | // 调用 | 262 | // 调用 |
| 178 | smsService.doSendSms(message); | 263 | smsService.doSendSms(message); |
| 179 | // 断言 | 264 | // 断言 |
| 180 | - verify(smsLogService, times(1)).updateSmsSendResult(eq(message.getLogId()), | 265 | + verify(smsLogService).updateSmsSendResult(eq(message.getLogId()), |
| 181 | eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()), | 266 | eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()), |
| 182 | eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo())); | 267 | eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo())); |
| 183 | } | 268 | } |