Browse Source

完善 SmsSendServiceImpl 单元测试

YunaiV 2 years ago
parent
commit
a332d5f893

+ 9 - 9
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 {
             }
         }
         // 执行发送
-        return this.sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams);
+        return sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams);
     }
 
     @Override
@@ -76,19 +76,19 @@ public class SmsSendServiceImpl implements SmsSendService {
             mobile = memberService.getMemberUserMobile(userId);
         }
         // 执行发送
-        return this.sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams);
+        return sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams);
     }
 
     @Override
     public Long sendSingleSms(String mobile, Long userId, Integer userType,
                               String templateCode, Map<String, Object> templateParams) {
         // 校验短信模板是否合法
-        SmsTemplateDO template = this.checkSmsTemplateValid(templateCode);
+        SmsTemplateDO template = validateSmsTemplate(templateCode);
         // 校验短信渠道是否合法
-        SmsChannelDO smsChannel = this.checkSmsChannelValid(template.getChannelId());
+        SmsChannelDO smsChannel = validateSmsChannel(template.getChannelId());
 
         // 校验手机号码是否存在
-        mobile = this.checkMobile(mobile);
+        mobile = validateMobile(mobile);
         // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志
         List<KeyValue<String, Object>> newTemplateParams = this.buildTemplateParams(template, templateParams);
 
@@ -108,7 +108,7 @@ public class SmsSendServiceImpl implements SmsSendService {
     }
 
     @VisibleForTesting
-    public SmsChannelDO checkSmsChannelValid(Long channelId) {
+    SmsChannelDO validateSmsChannel(Long channelId) {
         // 获得短信模板。考虑到效率,从缓存中获取
         SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId);
         // 短信模板不存在
@@ -119,7 +119,7 @@ public class SmsSendServiceImpl implements SmsSendService {
     }
 
     @VisibleForTesting
-    public SmsTemplateDO checkSmsTemplateValid(String templateCode) {
+    SmsTemplateDO validateSmsTemplate(String templateCode) {
         // 获得短信模板。考虑到效率,从缓存中获取
         SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode);
         // 短信模板不存在
@@ -139,7 +139,7 @@ public class SmsSendServiceImpl implements SmsSendService {
      * @return 处理后的参数
      */
     @VisibleForTesting
-    public List<KeyValue<String, Object>> buildTemplateParams(SmsTemplateDO template, Map<String, Object> templateParams) {
+    List<KeyValue<String, Object>> buildTemplateParams(SmsTemplateDO template, Map<String, Object> templateParams) {
         return template.getParams().stream().map(key -> {
             Object value = templateParams.get(key);
             if (value == null) {
@@ -150,7 +150,7 @@ public class SmsSendServiceImpl implements SmsSendService {
     }
 
     @VisibleForTesting
-    public String checkMobile(String mobile) {
+    public String validateMobile(String mobile) {
         if (StrUtil.isEmpty(mobile)) {
             throw exception(SMS_SEND_MOBILE_NOT_EXISTS);
         }

+ 93 - 8
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java

@@ -1,10 +1,6 @@
 package cn.iocoder.yudao.module.system.service.sms;
 
 import cn.hutool.core.map.MapUtil;
-import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO;
-import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO;
-import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage;
-import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer;
 import cn.iocoder.yudao.framework.common.core.KeyValue;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
@@ -14,6 +10,13 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO;
 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO;
 import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
+import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage;
+import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer;
+import cn.iocoder.yudao.module.system.service.member.MemberService;
+import cn.iocoder.yudao.module.system.service.user.AdminUserService;
 import org.assertj.core.util.Lists;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
@@ -36,6 +39,10 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
     @InjectMocks
     private SmsSendServiceImpl smsService;
 
+    @Mock
+    private AdminUserService adminUserService;
+    @Mock
+    private MemberService memberService;
     @Mock
     private SmsChannelService smsChannelService;
     @Mock
@@ -48,6 +55,84 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
     @Mock
     private SmsClientFactory smsClientFactory;
 
+    @Test
+    public void testSendSingleSmsToAdmin() {
+        // 准备参数
+        Long userId = randomLongId();
+        String templateCode = randomString();
+        Map<String, Object> templateParams = MapUtil.<String, Object>builder().put("code", "1234")
+                .put("op", "login").build();
+        // mock adminUserService 的方法
+        AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setMobile("15601691300"));
+        when(adminUserService.getUser(eq(userId))).thenReturn(user);
+
+        // mock SmsTemplateService 的方法
+        SmsTemplateDO template = randomPojo(SmsTemplateDO.class, o -> {
+            o.setStatus(CommonStatusEnum.ENABLE.getStatus());
+            o.setContent("验证码为{code}, 操作为{op}");
+            o.setParams(Lists.newArrayList("code", "op"));
+        });
+        when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
+        String content = randomString();
+        when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
+                .thenReturn(content);
+        // mock SmsChannelService 的方法
+        SmsChannelDO smsChannel = randomPojo(SmsChannelDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
+        when(smsChannelService.getSmsChannel(eq(template.getChannelId()))).thenReturn(smsChannel);
+        // mock SmsLogService 的方法
+        Long smsLogId = randomLongId();
+        when(smsLogService.createSmsLog(eq(user.getMobile()), eq(userId), eq(UserTypeEnum.ADMIN.getValue()), eq(Boolean.TRUE), eq(template),
+                eq(content), eq(templateParams))).thenReturn(smsLogId);
+
+        // 调用
+        Long resultSmsLogId = smsService.sendSingleSmsToAdmin(null, userId, templateCode, templateParams);
+        // 断言
+        assertEquals(smsLogId, resultSmsLogId);
+        // 断言调用
+        verify(smsProducer).sendSmsSendMessage(eq(smsLogId), eq(user.getMobile()),
+                eq(template.getChannelId()), eq(template.getApiTemplateId()),
+                eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login"))));
+    }
+
+    @Test
+    public void testSendSingleSmsToUser() {
+        // 准备参数
+        Long userId = randomLongId();
+        String templateCode = randomString();
+        Map<String, Object> templateParams = MapUtil.<String, Object>builder().put("code", "1234")
+                .put("op", "login").build();
+        // mock adminUserService 的方法
+        String mobile = "15601691300";
+        when(memberService.getMemberUserMobile(eq(userId))).thenReturn(mobile);
+
+        // mock SmsTemplateService 的方法
+        SmsTemplateDO template = randomPojo(SmsTemplateDO.class, o -> {
+            o.setStatus(CommonStatusEnum.ENABLE.getStatus());
+            o.setContent("验证码为{code}, 操作为{op}");
+            o.setParams(Lists.newArrayList("code", "op"));
+        });
+        when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
+        String content = randomString();
+        when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
+                .thenReturn(content);
+        // mock SmsChannelService 的方法
+        SmsChannelDO smsChannel = randomPojo(SmsChannelDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
+        when(smsChannelService.getSmsChannel(eq(template.getChannelId()))).thenReturn(smsChannel);
+        // mock SmsLogService 的方法
+        Long smsLogId = randomLongId();
+        when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(UserTypeEnum.MEMBER.getValue()), eq(Boolean.TRUE), eq(template),
+                eq(content), eq(templateParams))).thenReturn(smsLogId);
+
+        // 调用
+        Long resultSmsLogId = smsService.sendSingleSmsToMember(null, userId, templateCode, templateParams);
+        // 断言
+        assertEquals(smsLogId, resultSmsLogId);
+        // 断言调用
+        verify(smsProducer).sendSmsSendMessage(eq(smsLogId), eq(mobile),
+                eq(template.getChannelId()), eq(template.getApiTemplateId()),
+                eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login"))));
+    }
+
     /**
      * 发送成功,当短信模板开启时
      */
@@ -83,7 +168,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
         // 断言
         assertEquals(smsLogId, resultSmsLogId);
         // 断言调用
-        verify(smsProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile),
+        verify(smsProducer).sendSmsSendMessage(eq(smsLogId), eq(mobile),
                 eq(template.getChannelId()), eq(template.getApiTemplateId()),
                 eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login"))));
     }
@@ -134,7 +219,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
         // mock 方法
 
         // 调用,并断言异常
-        assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode),
+        assertServiceException(() -> smsService.validateSmsTemplate(templateCode),
                 SMS_SEND_TEMPLATE_NOT_EXISTS);
     }
 
@@ -157,7 +242,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
         // mock 方法
 
         // 调用,并断言异常
-        assertServiceException(() -> smsService.checkMobile(null),
+        assertServiceException(() -> smsService.validateMobile(null),
                 SMS_SEND_MOBILE_NOT_EXISTS);
     }
 
@@ -177,7 +262,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
         // 调用
         smsService.doSendSms(message);
         // 断言
-        verify(smsLogService, times(1)).updateSmsSendResult(eq(message.getLogId()),
+        verify(smsLogService).updateSmsSendResult(eq(message.getLogId()),
                 eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()),
                 eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo()));
     }