Commit 62dc3296d65e2b4f03b95da40cbab10ef0ca9095

Authored by YunaiV
1 parent 3d3c88dd

完善 mail 单元测试

yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailSendServiceImpl.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.system.service.mail;
3 3 import cn.hutool.core.util.StrUtil;
4 4 import cn.hutool.extra.mail.MailAccount;
5 5 import cn.hutool.extra.mail.MailUtil;
6   -import cn.iocoder.yudao.framework.common.core.KeyValue;
7 6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
8 7 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
9 8 import cn.iocoder.yudao.module.system.convert.mail.MailAccountConvert;
... ... @@ -20,15 +19,13 @@ import org.springframework.stereotype.Service;
20 19 import org.springframework.validation.annotation.Validated;
21 20  
22 21 import javax.annotation.Resource;
23   -import java.util.List;
24 22 import java.util.Map;
25   -import java.util.stream.Collectors;
26 23  
27 24 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
28 25 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
29 26  
30 27 /**
31   - * 邮箱模版 服务实现类
  28 + * 邮箱发送 Service 实现类
32 29 *
33 30 * @author wangjingyi
34 31 * @since 2022-03-21
... ... @@ -82,13 +79,13 @@ public class MailSendServiceImpl implements MailSendService {
82 79 public Long sendSingleMail(String mail, Long userId, Integer userType,
83 80 String templateCode, Map<String, Object> templateParams) {
84 81 // 校验邮箱模版是否合法
85   - MailTemplateDO template = checkMailTemplateValid(templateCode);
  82 + MailTemplateDO template = validateMailTemplate(templateCode);
86 83 // 校验邮箱账号是否合法
87   - MailAccountDO account = checkMailAccountValid(template.getAccountId());
  84 + MailAccountDO account = validateMailAccount(template.getAccountId());
88 85  
89 86 // 校验邮箱是否存在
90   - mail = checkMail(mail);
91   - checkTemplateParams(template, templateParams);
  87 + mail = validateMail(mail);
  88 + validateTemplateParams(template, templateParams);
92 89  
93 90 // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志
94 91 Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus());
... ... @@ -106,7 +103,7 @@ public class MailSendServiceImpl implements MailSendService {
106 103 @Override
107 104 public void doSendMail(MailSendMessage message) {
108 105 // 1. 创建发送账号
109   - MailAccountDO account = checkMailAccountValid(message.getAccountId());
  106 + MailAccountDO account = validateMailAccount(message.getAccountId());
110 107 MailAccount mailAccount = MailAccountConvert.INSTANCE.convert(account, message.getNickname());
111 108 // 2. 发送邮件
112 109 try {
... ... @@ -121,7 +118,7 @@ public class MailSendServiceImpl implements MailSendService {
121 118 }
122 119  
123 120 @VisibleForTesting
124   - public MailTemplateDO checkMailTemplateValid(String templateCode) {
  121 + MailTemplateDO validateMailTemplate(String templateCode) {
125 122 // 获得邮件模板。考虑到效率,从缓存中获取
126 123 MailTemplateDO template = mailTemplateService.getMailTemplateByCodeFromCache(templateCode);
127 124 // 邮件模板不存在
... ... @@ -132,7 +129,7 @@ public class MailSendServiceImpl implements MailSendService {
132 129 }
133 130  
134 131 @VisibleForTesting
135   - public MailAccountDO checkMailAccountValid(Long accountId) {
  132 + MailAccountDO validateMailAccount(Long accountId) {
136 133 // 获得邮箱账号。考虑到效率,从缓存中获取
137 134 MailAccountDO account = mailAccountService.getMailAccountFromCache(accountId);
138 135 // 邮箱账号不存在
... ... @@ -143,7 +140,7 @@ public class MailSendServiceImpl implements MailSendService {
143 140 }
144 141  
145 142 @VisibleForTesting
146   - public String checkMail(String mail) {
  143 + String validateMail(String mail) {
147 144 if (StrUtil.isEmpty(mail)) {
148 145 throw exception(MAIL_SEND_MAIL_NOT_EXISTS);
149 146 }
... ... @@ -157,7 +154,7 @@ public class MailSendServiceImpl implements MailSendService {
157 154 * @param templateParams 参数列表
158 155 */
159 156 @VisibleForTesting
160   - public void checkTemplateParams(MailTemplateDO template, Map<String, Object> templateParams) {
  157 + void validateTemplateParams(MailTemplateDO template, Map<String, Object> templateParams) {
161 158 template.getParams().forEach(key -> {
162 159 Object value = templateParams.get(key);
163 160 if (value == null) {
... ...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailAccountServiceImplTest.java
... ... @@ -6,7 +6,6 @@ import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccou
6 6 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO;
7 7 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountUpdateReqVO;
8 8 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO;
9   -import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
10 9 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailAccountMapper;
11 10 import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer;
12 11 import org.junit.jupiter.api.Test;
... ... @@ -14,7 +13,7 @@ import org.springframework.boot.test.mock.mockito.MockBean;
14 13 import org.springframework.context.annotation.Import;
15 14  
16 15 import javax.annotation.Resource;
17   -
  16 +import java.util.List;
18 17 import java.util.Map;
19 18  
20 19 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
... ... @@ -23,7 +22,9 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic
23 22 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
24 23 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_NOT_EXISTS;
25 24 import static org.junit.jupiter.api.Assertions.*;
  25 +import static org.mockito.ArgumentMatchers.eq;
26 26 import static org.mockito.Mockito.verify;
  27 +import static org.mockito.Mockito.when;
27 28  
28 29 /**
29 30 * {@link MailAccountServiceImpl} 的单元测试类
... ... @@ -109,6 +110,8 @@ public class MailAccountServiceImplTest extends BaseDbUnitTest {
109 110 mailAccountMapper.insert(dbMailAccount);// @Sql: 先插入出一条存在的数据
110 111 // 准备参数
111 112 Long id = dbMailAccount.getId();
  113 + // mock 方法(无关联模版)
  114 + when(mailTemplateService.countByAccountId(eq(id))).thenReturn(0L);
112 115  
113 116 // 调用
114 117 mailAccountService.deleteMailAccount(id);
... ... @@ -118,6 +121,21 @@ public class MailAccountServiceImplTest extends BaseDbUnitTest {
118 121 }
119 122  
120 123 @Test
  124 + public void testGetMailAccountFromCache() {
  125 + // mock 数据
  126 + MailAccountDO dbMailAccount = randomPojo(MailAccountDO.class);
  127 + mailAccountMapper.insert(dbMailAccount);// @Sql: 先插入出一条存在的数据
  128 + mailAccountService.initLocalCache();
  129 + // 准备参数
  130 + Long id = dbMailAccount.getId();
  131 +
  132 + // 调用
  133 + MailAccountDO mailAccount = mailAccountService.getMailAccountFromCache(id);
  134 + // 断言
  135 + assertPojoEquals(dbMailAccount, mailAccount);
  136 + }
  137 +
  138 + @Test
121 139 public void testDeleteMailAccount_notExists() {
122 140 // 准备参数
123 141 Long id = randomLongId();
... ... @@ -151,4 +169,35 @@ public class MailAccountServiceImplTest extends BaseDbUnitTest {
151 169 assertPojoEquals(dbMailAccount, pageResult.getList().get(0));
152 170 }
153 171  
  172 + @Test
  173 + public void testGetMailAccount() {
  174 + // mock 数据
  175 + MailAccountDO dbMailAccount = randomPojo(MailAccountDO.class);
  176 + mailAccountMapper.insert(dbMailAccount);// @Sql: 先插入出一条存在的数据
  177 + // 准备参数
  178 + Long id = dbMailAccount.getId();
  179 +
  180 + // 调用
  181 + MailAccountDO mailAccount = mailAccountService.getMailAccount(id);
  182 + // 断言
  183 + assertPojoEquals(dbMailAccount, mailAccount);
  184 + }
  185 +
  186 + @Test
  187 + public void testGetMailAccountList() {
  188 + // mock 数据
  189 + MailAccountDO dbMailAccount01 = randomPojo(MailAccountDO.class);
  190 + mailAccountMapper.insert(dbMailAccount01);
  191 + MailAccountDO dbMailAccount02 = randomPojo(MailAccountDO.class);
  192 + mailAccountMapper.insert(dbMailAccount02);
  193 + // 准备参数
  194 +
  195 + // 调用
  196 + List<MailAccountDO> list = mailAccountService.getMailAccountList();
  197 + // 断言
  198 + assertEquals(2, list.size());
  199 + assertPojoEquals(dbMailAccount01, list.get(0));
  200 + assertPojoEquals(dbMailAccount02, list.get(1));
  201 + }
  202 +
154 203 }
... ...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailLogServiceImplTest.java
... ... @@ -117,6 +117,20 @@ public class MailLogServiceImplTest extends BaseDbUnitTest {
117 117 }
118 118  
119 119 @Test
  120 + public void testGetMailLog() {
  121 + // mock 数据
  122 + MailLogDO dbMailLog = randomPojo(MailLogDO.class, o -> o.setTemplateParams(randomTemplateParams()));
  123 + mailLogMapper.insert(dbMailLog);
  124 + // 准备参数
  125 + Long id = dbMailLog.getId();
  126 +
  127 + // 调用
  128 + MailLogDO mailLog = mailLogService.getMailLog(id);
  129 + // 断言
  130 + assertPojoEquals(dbMailLog, mailLog);
  131 + }
  132 +
  133 + @Test
120 134 public void testGetMailLogPage() {
121 135 // mock 数据
122 136 MailLogDO dbMailLog = randomPojo(MailLogDO.class, o -> { // 等会查询到
... ...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailSendServiceImplTest.java
... ... @@ -6,14 +6,20 @@ import cn.hutool.extra.mail.MailUtil;
6 6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7 7 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
8 8 import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
  9 +import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
9 10 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO;
10 11 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
  12 +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
  13 +import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage;
11 14 import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer;
  15 +import cn.iocoder.yudao.module.system.service.member.MemberService;
  16 +import cn.iocoder.yudao.module.system.service.user.AdminUserService;
12 17 import org.assertj.core.util.Lists;
13 18 import org.junit.jupiter.api.Disabled;
14 19 import org.junit.jupiter.api.Test;
15 20 import org.mockito.InjectMocks;
16 21 import org.mockito.Mock;
  22 +import org.mockito.MockedStatic;
17 23  
18 24 import java.util.HashMap;
19 25 import java.util.Map;
... ... @@ -23,6 +29,7 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic
23 29 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
24 30 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
25 31 import static org.junit.jupiter.api.Assertions.assertEquals;
  32 +import static org.junit.jupiter.api.Assertions.assertTrue;
26 33 import static org.mockito.ArgumentMatchers.eq;
27 34 import static org.mockito.Mockito.*;
28 35  
... ... @@ -32,6 +39,10 @@ class MailSendServiceImplTest extends BaseMockitoUnitTest {
32 39 private MailSendServiceImpl mailSendService;
33 40  
34 41 @Mock
  42 + private AdminUserService adminUserService;
  43 + @Mock
  44 + private MemberService memberService;
  45 + @Mock
35 46 private MailAccountService mailAccountService;
36 47 @Mock
37 48 private MailTemplateService mailTemplateService;
... ... @@ -55,6 +66,82 @@ class MailSendServiceImplTest extends BaseMockitoUnitTest {
55 66 System.out.println("发送结果:" + messageId);
56 67 }
57 68  
  69 + @Test
  70 + public void testSendSingleMailToAdmin() {
  71 + // 准备参数
  72 + Long userId = randomLongId();
  73 + String templateCode = RandomUtils.randomString();
  74 + Map<String, Object> templateParams = MapUtil.<String, Object>builder().put("code", "1234")
  75 + .put("op", "login").build();
  76 + // mock adminUserService 的方法
  77 + AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setMobile("15601691300"));
  78 + when(adminUserService.getUser(eq(userId))).thenReturn(user);
  79 +
  80 + // mock MailTemplateService 的方法
  81 + MailTemplateDO template = randomPojo(MailTemplateDO.class, o -> {
  82 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  83 + o.setContent("验证码为{code}, 操作为{op}");
  84 + o.setParams(Lists.newArrayList("code", "op"));
  85 + });
  86 + when(mailTemplateService.getMailTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
  87 + String content = RandomUtils.randomString();
  88 + when(mailTemplateService.formatMailTemplateContent(eq(template.getContent()), eq(templateParams)))
  89 + .thenReturn(content);
  90 + // mock MailAccountService 的方法
  91 + MailAccountDO account = randomPojo(MailAccountDO.class);
  92 + when(mailAccountService.getMailAccountFromCache(eq(template.getAccountId()))).thenReturn(account);
  93 + // mock MailLogService 的方法
  94 + Long mailLogId = randomLongId();
  95 + when(mailLogService.createMailLog(eq(userId), eq(UserTypeEnum.ADMIN.getValue()), eq(user.getEmail()),
  96 + eq(account), eq(template), eq(content), eq(templateParams), eq(true))).thenReturn(mailLogId);
  97 +
  98 + // 调用
  99 + Long resultMailLogId = mailSendService.sendSingleMailToAdmin(null, userId, templateCode, templateParams);
  100 + // 断言
  101 + assertEquals(mailLogId, resultMailLogId);
  102 + // 断言调用
  103 + verify(mailProducer).sendMailSendMessage(eq(mailLogId), eq(user.getEmail()),
  104 + eq(account.getId()), eq(template.getNickname()), eq(template.getTitle()), eq(content));
  105 + }
  106 +
  107 + @Test
  108 + public void testSendSingleMailToMember() {
  109 + // 准备参数
  110 + Long userId = randomLongId();
  111 + String templateCode = RandomUtils.randomString();
  112 + Map<String, Object> templateParams = MapUtil.<String, Object>builder().put("code", "1234")
  113 + .put("op", "login").build();
  114 + // mock memberService 的方法
  115 + String mail = randomEmail();
  116 + when(memberService.getMemberUserEmail(eq(userId))).thenReturn(mail);
  117 +
  118 + // mock MailTemplateService 的方法
  119 + MailTemplateDO template = randomPojo(MailTemplateDO.class, o -> {
  120 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  121 + o.setContent("验证码为{code}, 操作为{op}");
  122 + o.setParams(Lists.newArrayList("code", "op"));
  123 + });
  124 + when(mailTemplateService.getMailTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
  125 + String content = RandomUtils.randomString();
  126 + when(mailTemplateService.formatMailTemplateContent(eq(template.getContent()), eq(templateParams)))
  127 + .thenReturn(content);
  128 + // mock MailAccountService 的方法
  129 + MailAccountDO account = randomPojo(MailAccountDO.class);
  130 + when(mailAccountService.getMailAccountFromCache(eq(template.getAccountId()))).thenReturn(account);
  131 + // mock MailLogService 的方法
  132 + Long mailLogId = randomLongId();
  133 + when(mailLogService.createMailLog(eq(userId), eq(UserTypeEnum.MEMBER.getValue()), eq(mail),
  134 + eq(account), eq(template), eq(content), eq(templateParams), eq(true))).thenReturn(mailLogId);
  135 +
  136 + // 调用
  137 + Long resultMailLogId = mailSendService.sendSingleMailToMember(null, userId, templateCode, templateParams);
  138 + // 断言
  139 + assertEquals(mailLogId, resultMailLogId);
  140 + // 断言调用
  141 + verify(mailProducer).sendMailSendMessage(eq(mailLogId), eq(mail),
  142 + eq(account.getId()), eq(template.getNickname()), eq(template.getTitle()), eq(content));
  143 + }
  144 +
58 145 /**
59 146 * 发送成功,当短信模板开启时
60 147 */
... ... @@ -64,7 +151,7 @@ class MailSendServiceImplTest extends BaseMockitoUnitTest {
64 151 String mail = randomEmail();
65 152 Long userId = randomLongId();
66 153 Integer userType = randomEle(UserTypeEnum.values()).getValue();
67   - String templateCode = randomString();
  154 + String templateCode = RandomUtils.randomString();
68 155 Map<String, Object> templateParams = MapUtil.<String, Object>builder().put("code", "1234")
69 156 .put("op", "login").build();
70 157 // mock MailTemplateService 的方法
... ... @@ -74,7 +161,7 @@ class MailSendServiceImplTest extends BaseMockitoUnitTest {
74 161 o.setParams(Lists.newArrayList("code", "op"));
75 162 });
76 163 when(mailTemplateService.getMailTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
77   - String content = randomString();
  164 + String content = RandomUtils.randomString();
78 165 when(mailTemplateService.formatMailTemplateContent(eq(template.getContent()), eq(templateParams)))
79 166 .thenReturn(content);
80 167 // mock MailAccountService 的方法
... ... @@ -103,7 +190,7 @@ class MailSendServiceImplTest extends BaseMockitoUnitTest {
103 190 String mail = randomEmail();
104 191 Long userId = randomLongId();
105 192 Integer userType = randomEle(UserTypeEnum.values()).getValue();
106   - String templateCode = randomString();
  193 + String templateCode = RandomUtils.randomString();
107 194 Map<String, Object> templateParams = MapUtil.<String, Object>builder().put("code", "1234")
108 195 .put("op", "login").build();
109 196 // mock MailTemplateService 的方法
... ... @@ -113,7 +200,7 @@ class MailSendServiceImplTest extends BaseMockitoUnitTest {
113 200 o.setParams(Lists.newArrayList("code", "op"));
114 201 });
115 202 when(mailTemplateService.getMailTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
116   - String content = randomString();
  203 + String content = RandomUtils.randomString();
117 204 when(mailTemplateService.formatMailTemplateContent(eq(template.getContent()), eq(templateParams)))
118 205 .thenReturn(content);
119 206 // mock MailAccountService 的方法
... ... @@ -134,18 +221,18 @@ class MailSendServiceImplTest extends BaseMockitoUnitTest {
134 221 }
135 222  
136 223 @Test
137   - public void testCheckMailTemplateValid_notExists() {
  224 + public void testValidateMailTemplateValid_notExists() {
138 225 // 准备参数
139   - String templateCode = randomString();
  226 + String templateCode = RandomUtils.randomString();
140 227 // mock 方法
141 228  
142 229 // 调用,并断言异常
143   - assertServiceException(() -> mailSendService.checkMailTemplateValid(templateCode),
  230 + assertServiceException(() -> mailSendService.validateMailTemplate(templateCode),
144 231 MAIL_TEMPLATE_NOT_EXISTS);
145 232 }
146 233  
147 234 @Test
148   - public void testCheckTemplateParams_paramMiss() {
  235 + public void testValidateTemplateParams_paramMiss() {
149 236 // 准备参数
150 237 MailTemplateDO template = randomPojo(MailTemplateDO.class,
151 238 o -> o.setParams(Lists.newArrayList("code")));
... ... @@ -153,18 +240,80 @@ class MailSendServiceImplTest extends BaseMockitoUnitTest {
153 240 // mock 方法
154 241  
155 242 // 调用,并断言异常
156   - assertServiceException(() -> mailSendService.checkTemplateParams(template, templateParams),
  243 + assertServiceException(() -> mailSendService.validateTemplateParams(template, templateParams),
157 244 MAIL_SEND_TEMPLATE_PARAM_MISS, "code");
158 245 }
159 246  
160 247 @Test
161   - public void testCheckMail_notExists() {
  248 + public void testValidateMail_notExists() {
162 249 // 准备参数
163 250 // mock 方法
164 251  
165 252 // 调用,并断言异常
166   - assertServiceException(() -> mailSendService.checkMail(null),
  253 + assertServiceException(() -> mailSendService.validateMail(null),
167 254 MAIL_SEND_MAIL_NOT_EXISTS);
168 255 }
169 256  
  257 + @Test
  258 + public void testDoSendMail_success() {
  259 + try (MockedStatic<MailUtil> mailUtilMock = mockStatic(MailUtil.class)) {
  260 + // 准备参数
  261 + MailSendMessage message = randomPojo(MailSendMessage.class, o -> o.setNickname("芋艿"));
  262 + // mock 方法(获得邮箱账号)
  263 + MailAccountDO account = randomPojo(MailAccountDO.class, o -> o.setMail("7685@qq.com"));
  264 + when(mailAccountService.getMailAccountFromCache(eq(message.getAccountId())))
  265 + .thenReturn(account);
  266 +
  267 + // mock 方法(发送邮件)
  268 + String messageId = randomString();
  269 + mailUtilMock.when(() -> MailUtil.send(argThat(mailAccount -> {
  270 + assertEquals("芋艿 <7685@qq.com>", mailAccount.getFrom());
  271 + assertTrue(mailAccount.isAuth());
  272 + assertEquals(account.getUsername(), mailAccount.getUser());
  273 + assertEquals(account.getPassword(), mailAccount.getPass());
  274 + assertEquals(account.getHost(), mailAccount.getHost());
  275 + assertEquals(account.getPort(), mailAccount.getPort());
  276 + assertEquals(account.getSslEnable(), mailAccount.isSslEnable());
  277 + return true;
  278 + }), eq(message.getMail()), eq(message.getTitle()), eq(message.getContent()), eq(true)))
  279 + .thenReturn(messageId);
  280 +
  281 + // 调用
  282 + mailSendService.doSendMail(message);
  283 + // 断言
  284 + verify(mailLogService).updateMailSendResult(eq(message.getLogId()), eq(messageId), isNull());
  285 + }
  286 + }
  287 +
  288 + @Test
  289 + public void testDoSendMail_exception() {
  290 + try (MockedStatic<MailUtil> mailUtilMock = mockStatic(MailUtil.class)) {
  291 + // 准备参数
  292 + MailSendMessage message = randomPojo(MailSendMessage.class, o -> o.setNickname("芋艿"));
  293 + // mock 方法(获得邮箱账号)
  294 + MailAccountDO account = randomPojo(MailAccountDO.class, o -> o.setMail("7685@qq.com"));
  295 + when(mailAccountService.getMailAccountFromCache(eq(message.getAccountId())))
  296 + .thenReturn(account);
  297 +
  298 + // mock 方法(发送邮件)
  299 + Exception e = new NullPointerException("啦啦啦");
  300 + mailUtilMock.when(() -> MailUtil.send(argThat(mailAccount -> {
  301 + assertEquals("芋艿 <7685@qq.com>", mailAccount.getFrom());
  302 + assertTrue(mailAccount.isAuth());
  303 + assertEquals(account.getUsername(), mailAccount.getUser());
  304 + assertEquals(account.getPassword(), mailAccount.getPass());
  305 + assertEquals(account.getHost(), mailAccount.getHost());
  306 + assertEquals(account.getPort(), mailAccount.getPort());
  307 + assertEquals(account.getSslEnable(), mailAccount.isSslEnable());
  308 + return true;
  309 + }), eq(message.getMail()), eq(message.getTitle()), eq(message.getContent()), eq(true)))
  310 + .thenThrow(e);
  311 +
  312 + // 调用
  313 + mailSendService.doSendMail(message);
  314 + // 断言
  315 + verify(mailLogService).updateMailSendResult(eq(message.getLogId()), isNull(), same(e));
  316 + }
  317 + }
  318 +
170 319 }
... ...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java
... ... @@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
6 6 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateCreateReqVO;
7 7 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO;
8 8 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateUpdateReqVO;
9   -import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO;
10 9 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
11 10 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper;
12 11 import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer;
... ... @@ -15,7 +14,8 @@ import org.springframework.boot.test.mock.mockito.MockBean;
15 14 import org.springframework.context.annotation.Import;
16 15  
17 16 import javax.annotation.Resource;
18   -
  17 +import java.util.HashMap;
  18 +import java.util.List;
19 19 import java.util.Map;
20 20  
21 21 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
... ... @@ -27,6 +27,7 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId
27 27 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
28 28 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_NOT_EXISTS;
29 29 import static org.junit.jupiter.api.Assertions.*;
  30 +import static org.mockito.Mockito.verify;
30 31  
31 32 /**
32 33 * {@link MailTemplateServiceImpl} 的单元测试类
... ... @@ -72,6 +73,7 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest {
72 73 // 校验记录的属性是否正确
73 74 MailTemplateDO mailTemplate = mailTemplateMapper.selectById(mailTemplateId);
74 75 assertPojoEquals(reqVO, mailTemplate);
  76 + verify(mailProducer).sendMailTemplateRefreshMessage();
75 77 }
76 78  
77 79 @Test
... ... @@ -89,6 +91,7 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest {
89 91 // 校验是否更新正确
90 92 MailTemplateDO mailTemplate = mailTemplateMapper.selectById(reqVO.getId()); // 获取最新的
91 93 assertPojoEquals(reqVO, mailTemplate);
  94 + verify(mailProducer).sendMailTemplateRefreshMessage();
92 95 }
93 96  
94 97 @Test
... ... @@ -110,8 +113,9 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest {
110 113  
111 114 // 调用
112 115 mailTemplateService.deleteMailTemplate(id);
113   - // 校验数据不存在了
114   - assertNull(mailTemplateMapper.selectById(id));
  116 + // 校验数据不存在了
  117 + assertNull(mailTemplateMapper.selectById(id));
  118 + verify(mailProducer).sendMailTemplateRefreshMessage();
115 119 }
116 120  
117 121 @Test
... ... @@ -160,4 +164,77 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest {
160 164 assertPojoEquals(dbMailTemplate, pageResult.getList().get(0));
161 165 }
162 166  
  167 + @Test
  168 + public void testGetMailTemplateList() {
  169 + // mock 数据
  170 + MailTemplateDO dbMailTemplate01 = randomPojo(MailTemplateDO.class);
  171 + mailTemplateMapper.insert(dbMailTemplate01);
  172 + MailTemplateDO dbMailTemplate02 = randomPojo(MailTemplateDO.class);
  173 + mailTemplateMapper.insert(dbMailTemplate02);
  174 +
  175 + // 调用
  176 + List<MailTemplateDO> list = mailTemplateService.getMailTemplateList();
  177 + // 断言
  178 + assertEquals(2, list.size());
  179 + assertEquals(dbMailTemplate01, list.get(0));
  180 + assertEquals(dbMailTemplate02, list.get(1));
  181 + }
  182 +
  183 + @Test
  184 + public void testGetTemplate() {
  185 + // mock 数据
  186 + MailTemplateDO dbMailTemplate = randomPojo(MailTemplateDO.class);
  187 + mailTemplateMapper.insert(dbMailTemplate);
  188 + // 准备参数
  189 + Long id = dbMailTemplate.getId();
  190 +
  191 + // 调用
  192 + MailTemplateDO mailTemplate = mailTemplateService.getMailTemplate(id);
  193 + // 断言
  194 + assertPojoEquals(dbMailTemplate, mailTemplate);
  195 + }
  196 +
  197 + @Test
  198 + public void testGetMailTemplateByCodeFromCache() {
  199 + // mock 数据
  200 + MailTemplateDO dbMailTemplate = randomPojo(MailTemplateDO.class);
  201 + mailTemplateMapper.insert(dbMailTemplate);
  202 + mailTemplateService.initLocalCache();
  203 + // 准备参数
  204 + String code = dbMailTemplate.getCode();
  205 +
  206 + // 调用
  207 + MailTemplateDO mailTemplate = mailTemplateService.getMailTemplateByCodeFromCache(code);
  208 + // 断言
  209 + assertPojoEquals(dbMailTemplate, mailTemplate);
  210 + }
  211 +
  212 + @Test
  213 + public void testFormatMailTemplateContent() {
  214 + // 准备参数
  215 + Map<String, Object> params = new HashMap<>();
  216 + params.put("name", "小红");
  217 + params.put("what", "饭");
  218 +
  219 + // 调用,并断言
  220 + assertEquals("小红,你好,饭吃了吗?",
  221 + mailTemplateService.formatMailTemplateContent("{name},你好,{what}吃了吗?", params));
  222 + }
  223 +
  224 + @Test
  225 + public void testCountByAccountId() {
  226 + // mock 数据
  227 + MailTemplateDO dbMailTemplate = randomPojo(MailTemplateDO.class);
  228 + mailTemplateMapper.insert(dbMailTemplate);
  229 + // 测试 accountId 不匹配
  230 + mailTemplateMapper.insert(cloneIgnoreId(dbMailTemplate, o -> o.setAccountId(2L)));
  231 + // 准备参数
  232 + Long accountId = dbMailTemplate.getAccountId();
  233 +
  234 + // 调用
  235 + long count = mailTemplateService.countByAccountId(accountId);
  236 + // 断言
  237 + assertEquals(1, count);
  238 + }
  239 +
163 240 }
... ...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImplTest.java
... ... @@ -101,7 +101,7 @@ public class SmsSendServiceImplTest extends BaseMockitoUnitTest {
101 101 String templateCode = randomString();
102 102 Map<String, Object> templateParams = MapUtil.<String, Object>builder().put("code", "1234")
103 103 .put("op", "login").build();
104   - // mock adminUserService 的方法
  104 + // mock memberService 的方法
105 105 String mobile = "15601691300";
106 106 when(memberService.getMemberUserMobile(eq(userId))).thenReturn(mobile);
107 107  
... ...