Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
5a18223b
提交
5a18223b
authored
2月 02, 2023
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
完善 SmsSendServiceImpl 单元测试
上级
0d814315
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
103 行增加
和
18 行删除
+103
-18
SmsSendServiceImpl.java
...r/yudao/module/system/service/sms/SmsSendServiceImpl.java
+10
-10
SmsSendServiceTest.java
...r/yudao/module/system/service/sms/SmsSendServiceTest.java
+93
-8
没有找到文件。
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java
浏览文件 @
5a18223b
...
...
@@ -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
.
check
Mobile
(
mobile
);
mobile
=
validate
Mobile
(
mobile
);
// 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志
List
<
KeyValue
<
String
,
Object
>>
newTemplateParams
=
this
.
buildTemplateParams
(
template
,
templateParams
);
...
...
@@ -108,18 +108,18 @@ public class SmsSendServiceImpl implements SmsSendService {
}
@VisibleForTesting
public
SmsChannelDO
checkSmsChannelValid
(
Long
channelId
)
{
SmsChannelDO
validateSmsChannel
(
Long
channelId
)
{
// 获得短信模板。考虑到效率,从缓存中获取
SmsChannelDO
channelDO
=
smsChannelService
.
getSmsChannel
(
channelId
);
// 短信模板不存在
if
(
channelDO
==
null
)
{
throw
exception
(
SMS_
SEND_TEMPLATE
_NOT_EXISTS
);
throw
exception
(
SMS_
CHANNEL
_NOT_EXISTS
);
}
return
channelDO
;
}
@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
check
Mobile
(
String
mobile
)
{
public
String
validate
Mobile
(
String
mobile
)
{
if
(
StrUtil
.
isEmpty
(
mobile
))
{
throw
exception
(
SMS_SEND_MOBILE_NOT_EXISTS
);
}
...
...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java
浏览文件 @
5a18223b
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
.
check
Mobile
(
null
),
assertServiceException
(()
->
smsService
.
validate
Mobile
(
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
()));
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论