Commit a332d5f893dbb04f0d16c10b0d92ec496da5a4dc

Authored by YunaiV
1 parent e7d0b8da

完善 SmsSendServiceImpl 单元测试

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 }