完善 SmsSendServiceImpl 单元测试
parent
0d81431541
commit
5a18223bc3
|
@ -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
|
@Override
|
||||||
|
@ -76,19 +76,19 @@ public class SmsSendServiceImpl implements SmsSendService {
|
||||||
mobile = memberService.getMemberUserMobile(userId);
|
mobile = memberService.getMemberUserMobile(userId);
|
||||||
}
|
}
|
||||||
// 执行发送
|
// 执行发送
|
||||||
return this.sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams);
|
return sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long sendSingleSms(String mobile, Long userId, Integer userType,
|
public Long sendSingleSms(String mobile, Long userId, Integer userType,
|
||||||
String templateCode, Map<String, Object> templateParams) {
|
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);
|
List<KeyValue<String, Object>> newTemplateParams = this.buildTemplateParams(template, templateParams);
|
||||||
|
|
||||||
|
@ -108,18 +108,18 @@ public class SmsSendServiceImpl implements SmsSendService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public SmsChannelDO checkSmsChannelValid(Long channelId) {
|
SmsChannelDO validateSmsChannel(Long channelId) {
|
||||||
// 获得短信模板。考虑到效率,从缓存中获取
|
// 获得短信模板。考虑到效率,从缓存中获取
|
||||||
SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId);
|
SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId);
|
||||||
// 短信模板不存在
|
// 短信模板不存在
|
||||||
if (channelDO == null) {
|
if (channelDO == null) {
|
||||||
throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS);
|
throw exception(SMS_CHANNEL_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
return channelDO;
|
return channelDO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public SmsTemplateDO checkSmsTemplateValid(String templateCode) {
|
SmsTemplateDO validateSmsTemplate(String templateCode) {
|
||||||
// 获得短信模板。考虑到效率,从缓存中获取
|
// 获得短信模板。考虑到效率,从缓存中获取
|
||||||
SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode);
|
SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode);
|
||||||
// 短信模板不存在
|
// 短信模板不存在
|
||||||
|
@ -139,7 +139,7 @@ public class SmsSendServiceImpl implements SmsSendService {
|
||||||
* @return 处理后的参数
|
* @return 处理后的参数
|
||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@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 -> {
|
return template.getParams().stream().map(key -> {
|
||||||
Object value = templateParams.get(key);
|
Object value = templateParams.get(key);
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
|
@ -150,7 +150,7 @@ public class SmsSendServiceImpl implements SmsSendService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public String checkMobile(String mobile) {
|
public String validateMobile(String mobile) {
|
||||||
if (StrUtil.isEmpty(mobile)) {
|
if (StrUtil.isEmpty(mobile)) {
|
||||||
throw exception(SMS_SEND_MOBILE_NOT_EXISTS);
|
throw exception(SMS_SEND_MOBILE_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
package cn.iocoder.yudao.module.system.service.sms;
|
package cn.iocoder.yudao.module.system.service.sms;
|
||||||
|
|
||||||
import cn.hutool.core.map.MapUtil;
|
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.core.KeyValue;
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
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.SmsReceiveRespDTO;
|
||||||
import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO;
|
import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO;
|
||||||
import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
|
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.assertj.core.util.Lists;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.mockito.InjectMocks;
|
import org.mockito.InjectMocks;
|
||||||
|
@ -36,6 +39,10 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
|
||||||
@InjectMocks
|
@InjectMocks
|
||||||
private SmsSendServiceImpl smsService;
|
private SmsSendServiceImpl smsService;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private AdminUserService adminUserService;
|
||||||
|
@Mock
|
||||||
|
private MemberService memberService;
|
||||||
@Mock
|
@Mock
|
||||||
private SmsChannelService smsChannelService;
|
private SmsChannelService smsChannelService;
|
||||||
@Mock
|
@Mock
|
||||||
|
@ -48,6 +55,84 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
|
||||||
@Mock
|
@Mock
|
||||||
private SmsClientFactory smsClientFactory;
|
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);
|
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(template.getChannelId()), eq(template.getApiTemplateId()),
|
||||||
eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login"))));
|
eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login"))));
|
||||||
}
|
}
|
||||||
|
@ -134,7 +219,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
|
||||||
// mock 方法
|
// mock 方法
|
||||||
|
|
||||||
// 调用,并断言异常
|
// 调用,并断言异常
|
||||||
assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode),
|
assertServiceException(() -> smsService.validateSmsTemplate(templateCode),
|
||||||
SMS_SEND_TEMPLATE_NOT_EXISTS);
|
SMS_SEND_TEMPLATE_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +242,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
|
||||||
// mock 方法
|
// mock 方法
|
||||||
|
|
||||||
// 调用,并断言异常
|
// 调用,并断言异常
|
||||||
assertServiceException(() -> smsService.checkMobile(null),
|
assertServiceException(() -> smsService.validateMobile(null),
|
||||||
SMS_SEND_MOBILE_NOT_EXISTS);
|
SMS_SEND_MOBILE_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,7 +262,7 @@ public class SmsSendServiceTest extends BaseMockitoUnitTest {
|
||||||
// 调用
|
// 调用
|
||||||
smsService.doSendSms(message);
|
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.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()),
|
||||||
eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo()));
|
eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo()));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue