Commit 6aeeeac90ffbbfdbd1f89333d9d830e6ae9b1138

Authored by YunaiV
1 parent 953d270d

增加 sms 的缓存的单元测试

src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuServiceTest.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.service.permission;
3 3 import cn.hutool.core.bean.BeanUtil;
4 4 import cn.hutool.core.lang.Assert;
5 5 import cn.iocoder.dashboard.BaseDbUnitTest;
  6 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
6 7 import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO;
7 8 import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuListReqVO;
8 9 import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO;
... ... @@ -52,18 +53,20 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
52 53 SysMenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L);
53 54 menuMapper.insert(menuDO2);
54 55  
55   - //调用
  56 + // 调用
56 57 sysMenuService.initLocalCache();
57 58  
58 59 // 获取代理对象
59 60 SysMenuServiceImpl target = (SysMenuServiceImpl) AopTargetUtils.getTarget(sysMenuService);
60 61  
61   - Map<Long, SysMenuDO> menuCache = (Map<Long, SysMenuDO>) BeanUtil.getFieldValue(target, "menuCache");
  62 + Map<Long, SysMenuDO> menuCache =
  63 + (Map<Long, SysMenuDO>) BeanUtil.getFieldValue(target, "menuCache");
62 64 Assert.isTrue(menuCache.size() == 2);
63 65 assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId()));
64 66 assertPojoEquals(menuDO2, menuCache.get(menuDO2.getId()));
65 67  
66   - Multimap<String, SysMenuDO> permissionMenuCache = (Multimap<String, SysMenuDO>) BeanUtil.getFieldValue(target, "permissionMenuCache");
  68 + Multimap<String, SysMenuDO> permissionMenuCache =
  69 + (Multimap<String, SysMenuDO>) BeanUtil.getFieldValue(target, "permissionMenuCache");
67 70 Assert.isTrue(permissionMenuCache.size() == 2);
68 71 assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission()));
69 72 assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission()));
... ... @@ -184,10 +187,9 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
184 187  
185 188 //断言
186 189 Assert.isTrue(menuDOS.size() == idMenuMap.size());
187   - menuDOS.stream().forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
  190 + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
188 191 }
189 192  
190   -
191 193 @Test
192 194 public void testGetMenusReqVo_success() {
193 195 Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
... ... @@ -218,7 +220,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
218 220  
219 221 //断言
220 222 Assert.isTrue(menuDOS.size() == idMenuMap.size());
221   - menuDOS.stream().forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
  223 + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
222 224 }
223 225  
224 226 @Test
... ... @@ -244,12 +246,12 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
244 246 menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);
245 247 mockCacheMap.put(menuDO.getId(), menuDO);
246 248  
247   - List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Arrays.asList(MenuTypeEnum.MENU.getType()), Arrays.asList(1));
  249 + List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(MenuTypeEnum.MENU.getType()),
  250 + Collections.singletonList(CommonStatusEnum.DISABLE.getStatus()));
248 251 Assert.isTrue(menuDOS.size() == idMenuMap.size());
249   - menuDOS.stream().forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
  252 + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
250 253 }
251 254  
252   -
253 255 @Test
254 256 public void testListMenusFromCache2_success() throws Exception {
255 257 Map<Long, SysMenuDO> mockCacheMap = new HashMap<>();
... ... @@ -306,14 +308,14 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
306 308 }
307 309  
308 310 @Test
309   - public void testCheckResource_success(){
310   - SysMenuDO sonMenu=initParentAndSonMenuDO();
311   - Long parentId=sonMenu.getParentId();
  311 + public void testCheckResource_success() {
  312 + SysMenuDO sonMenu = initParentAndSonMenuDO();
  313 + Long parentId = sonMenu.getParentId();
312 314  
313   - Long otherSonMenuId=randomLongId();
314   - String otherSonMenuName=randomString();
  315 + Long otherSonMenuId = randomLongId();
  316 + String otherSonMenuName = randomString();
315 317  
316   - sysMenuService.checkResource(parentId,otherSonMenuName,otherSonMenuId);
  318 + sysMenuService.checkResource(parentId, otherSonMenuName, otherSonMenuId);
317 319 }
318 320  
319 321 @Test
... ... @@ -324,7 +326,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
324 326 Long otherSonMenuId=randomLongId();
325 327 String otherSonMenuName=sonMenu.getName(); //相同名称
326 328  
327   - assertServiceException(()->sysMenuService.checkResource(parentId,otherSonMenuName,otherSonMenuId), MENU_NAME_DUPLICATE);
  329 + assertServiceException(() -> sysMenuService.checkResource(parentId, otherSonMenuName, otherSonMenuId), MENU_NAME_DUPLICATE);
328 330 }
329 331  
330 332 /**
... ... @@ -361,5 +363,4 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
361 363 });
362 364 }
363 365  
364   -
365 366 }
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelServiceTest.java
1 1 package cn.iocoder.dashboard.modules.system.service.sms;
2 2  
  3 +import cn.hutool.core.bean.BeanUtil;
3 4 import cn.iocoder.dashboard.BaseDbUnitTest;
4 5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
5 6 import cn.iocoder.dashboard.common.pojo.PageResult;
... ... @@ -9,6 +10,7 @@ import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChann
9 10 import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
10 11 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
11 12 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper;
  13 +import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer;
12 14 import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsChannelServiceImpl;
13 15 import cn.iocoder.dashboard.util.collection.ArrayUtils;
14 16 import cn.iocoder.dashboard.util.object.ObjectUtils;
... ... @@ -17,18 +19,19 @@ import org.springframework.boot.test.mock.mockito.MockBean;
17 19 import org.springframework.context.annotation.Import;
18 20  
19 21 import javax.annotation.Resource;
  22 +import java.util.Date;
20 23 import java.util.function.Consumer;
21 24  
22 25 import static cn.hutool.core.util.RandomUtil.randomEle;
23 26 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN;
24 27 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS;
25   -import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
26   -import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
  28 +import static cn.iocoder.dashboard.util.AssertUtils.*;
27 29 import static cn.iocoder.dashboard.util.RandomUtils.*;
28 30 import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
  31 +import static cn.iocoder.dashboard.util.object.ObjectUtils.max;
29 32 import static org.junit.jupiter.api.Assertions.*;
30 33 import static org.mockito.ArgumentMatchers.eq;
31   -import static org.mockito.Mockito.when;
  34 +import static org.mockito.Mockito.*;
32 35  
33 36 /**
34 37 * {@link SysSmsChannelServiceImpl} 的单元测试类
... ... @@ -41,14 +44,35 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest {
41 44 @Resource
42 45 private SysSmsChannelServiceImpl smsChannelService;
43 46  
44   - @MockBean
45   - private SmsClientFactory smsClientFactory;
46   -
47 47 @Resource
48 48 private SysSmsChannelMapper smsChannelMapper;
49 49  
50 50 @MockBean
  51 + private SmsClientFactory smsClientFactory;
  52 + @MockBean
51 53 private SysSmsTemplateService smsTemplateService;
  54 + @MockBean
  55 + private SysSmsProducer smsProducer;
  56 +
  57 + @Test
  58 + public void testInitLocalCache_success() {
  59 + // mock 数据s
  60 + SysSmsChannelDO smsChannelDO01 = randomSmsChannelDO();
  61 + smsChannelMapper.insert(smsChannelDO01);
  62 + SysSmsChannelDO smsChannelDO02 = randomSmsChannelDO();
  63 + smsChannelMapper.insert(smsChannelDO02);
  64 +
  65 + // 调用
  66 + smsChannelService.initSmsClients();
  67 + // 校验 maxUpdateTime 属性
  68 + Date maxUpdateTime = (Date) BeanUtil.getFieldValue(smsChannelService, "maxUpdateTime");
  69 + assertEquals(max(smsChannelDO01.getUpdateTime(), smsChannelDO02.getUpdateTime()), maxUpdateTime);
  70 + // 校验调用
  71 + verify(smsClientFactory, times(1)).createOrUpdateSmsClient(
  72 + argThat(properties -> isPojoEquals(smsChannelDO01, properties)));
  73 + verify(smsClientFactory, times(1)).createOrUpdateSmsClient(
  74 + argThat(properties -> isPojoEquals(smsChannelDO02, properties)));
  75 + }
52 76  
53 77 @Test
54 78 public void testCreateSmsChannel_success() {
... ... @@ -62,6 +86,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest {
62 86 // 校验记录的属性是否正确
63 87 SysSmsChannelDO smsChannel = smsChannelMapper.selectById(smsChannelId);
64 88 assertPojoEquals(reqVO, smsChannel);
  89 + // 校验调用
  90 + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage();
65 91 }
66 92  
67 93 @Test
... ... @@ -81,6 +107,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest {
81 107 // 校验是否更新正确
82 108 SysSmsChannelDO smsChannel = smsChannelMapper.selectById(reqVO.getId()); // 获取最新的
83 109 assertPojoEquals(reqVO, smsChannel);
  110 + // 校验调用
  111 + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage();
84 112 }
85 113  
86 114 @Test
... ... @@ -104,6 +132,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest {
104 132 smsChannelService.deleteSmsChannel(id);
105 133 // 校验数据不存在了
106 134 assertNull(smsChannelMapper.selectById(id));
  135 + // 校验调用
  136 + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage();
107 137 }
108 138  
109 139 @Test
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogServiceTest.java
... ... @@ -109,6 +109,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest {
109 109 assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo());
110 110 }
111 111  
  112 + @Test
112 113 public void testUpdateSmsReceiveResult() {
113 114 // mock 数据
114 115 SysSmsLogDO dbSmsLog = randomSmsLogDO(
... ... @@ -128,7 +129,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest {
128 129 assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus()
129 130 : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus());
130 131 assertEquals(receiveTime, dbSmsLog.getReceiveTime());
131   - assertEquals(apiReceiveCode, dbSmsLog.getApiSendCode());
  132 + assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode());
132 133 assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg());
133 134 }
134 135  
... ... @@ -233,6 +234,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest {
233 234 o.setTemplateParams(randomTemplateParams());
234 235 o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围
235 236 o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围
  237 + o.setSendStatus(randomEle(SysSmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围
236 238 o.setReceiveStatus(randomEle(SysSmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围
237 239 };
238 240 return randomPojo(SysSmsLogDO.class, ArrayUtils.append(consumer, consumers));
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateServiceTest.java
... ... @@ -16,6 +16,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
16 16 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
17 17 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper;
18 18 import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum;
  19 +import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer;
19 20 import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsTemplateServiceImpl;
20 21 import cn.iocoder.dashboard.util.collection.ArrayUtils;
21 22 import cn.iocoder.dashboard.util.object.ObjectUtils;
... ... @@ -25,18 +26,22 @@ import org.springframework.boot.test.mock.mockito.MockBean;
25 26 import org.springframework.context.annotation.Import;
26 27  
27 28 import javax.annotation.Resource;
  29 +import java.util.Date;
28 30 import java.util.List;
  31 +import java.util.Map;
29 32 import java.util.function.Consumer;
30 33  
  34 +import static cn.hutool.core.bean.BeanUtil.getFieldValue;
31 35 import static cn.hutool.core.util.RandomUtil.randomEle;
32 36 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
33 37 import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
34 38 import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
35 39 import static cn.iocoder.dashboard.util.RandomUtils.*;
36 40 import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
  41 +import static cn.iocoder.dashboard.util.object.ObjectUtils.max;
37 42 import static org.junit.jupiter.api.Assertions.*;
38 43 import static org.mockito.ArgumentMatchers.eq;
39   -import static org.mockito.Mockito.when;
  44 +import static org.mockito.Mockito.*;
40 45  
41 46 /**
42 47 * {@link SysSmsTemplateServiceImpl} 的单元测试类
... ... @@ -54,11 +59,33 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
54 59  
55 60 @MockBean
56 61 private SysSmsChannelService smsChannelService;
57   -
58 62 @MockBean
59 63 private SmsClientFactory smsClientFactory;
60 64 @MockBean
61 65 private SmsClient smsClient;
  66 + @MockBean
  67 + private SysSmsProducer smsProducer;
  68 +
  69 + @Test
  70 + @SuppressWarnings("unchecked")
  71 + void testInitLocalCache() {
  72 + // mock 数据
  73 + SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO();
  74 + smsTemplateMapper.insert(smsTemplate01);
  75 + SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO();
  76 + smsTemplateMapper.insert(smsTemplate02);
  77 +
  78 + // 调用
  79 + smsTemplateService.initLocalCache();
  80 + // 断言 deptCache 缓存
  81 + Map<String, SysSmsTemplateDO> smsTemplateCache = (Map<String, SysSmsTemplateDO>) getFieldValue(smsTemplateService, "smsTemplateCache");
  82 + assertEquals(2, smsTemplateCache.size());
  83 + assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode()));
  84 + assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode()));
  85 + // 断言 maxUpdateTime 缓存
  86 + Date maxUpdateTime = (Date) getFieldValue(smsTemplateService, "maxUpdateTime");
  87 + assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime);
  88 + }
62 89  
63 90 @Test
64 91 public void testParseTemplateContentParams() {
... ... @@ -101,6 +128,8 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
101 128 assertPojoEquals(reqVO, smsTemplate);
102 129 assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams());
103 130 assertEquals(channelDO.getCode(), smsTemplate.getChannelCode());
  131 + // 校验调用
  132 + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage();
104 133 }
105 134  
106 135 @Test
... ... @@ -134,6 +163,8 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
134 163 assertPojoEquals(reqVO, smsTemplate);
135 164 assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams());
136 165 assertEquals(channelDO.getCode(), smsTemplate.getChannelCode());
  166 + // 校验调用
  167 + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage();
137 168 }
138 169  
139 170 @Test
... ... @@ -157,6 +188,8 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
157 188 smsTemplateService.deleteSmsTemplate(id);
158 189 // 校验数据不存在了
159 190 assertNull(smsTemplateMapper.selectById(id));
  191 + // 校验调用
  192 + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage();
160 193 }
161 194  
162 195 @Test
... ... @@ -309,7 +342,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
309 342 }
310 343  
311 344 @Test
312   - public void testCheckDictDataValueUnique_valueDuplicateForCreate() {
  345 + public void testCheckSmsTemplateCodeDuplicate_valueDuplicateForCreate() {
313 346 // 准备参数
314 347 String code = randomString();
315 348 // mock 数据
... ... @@ -317,7 +350,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
317 350  
318 351 // 调用,校验异常
319 352 assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(null, code),
320   - SMS_TEMPLATE_CODE_DUPLICATE);
  353 + SMS_TEMPLATE_CODE_DUPLICATE, code);
321 354 }
322 355  
323 356 @Test
... ... @@ -330,7 +363,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
330 363  
331 364 // 调用,校验异常
332 365 assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(id, code),
333   - SMS_TEMPLATE_CODE_DUPLICATE);
  366 + SMS_TEMPLATE_CODE_DUPLICATE, code);
334 367 }
335 368  
336 369 // ========== 随机对象 ==========
... ...
src/test/java/cn/iocoder/dashboard/util/AssertUtils.java
... ... @@ -10,6 +10,7 @@ import org.junit.jupiter.api.function.Executable;
10 10  
11 11 import java.lang.reflect.Field;
12 12 import java.util.Arrays;
  13 +import java.util.Objects;
13 14  
14 15 import static org.junit.jupiter.api.Assertions.assertThrows;
15 16  
... ... @@ -51,6 +52,33 @@ public class AssertUtils {
51 52 }
52 53  
53 54 /**
  55 + * 比对两个对象的属性是否一致
  56 + *
  57 + * 注意,如果 expected 存在的属性,actual 不存在的时候,会进行忽略
  58 + *
  59 + * @param expected 期望对象
  60 + * @param actual 实际对象
  61 + * @param ignoreFields 忽略的属性数组
  62 + * @return 是否一致
  63 + */
  64 + public static boolean isPojoEquals(Object expected, Object actual, String... ignoreFields) {
  65 + Field[] expectedFields = ReflectUtil.getFields(expected.getClass());
  66 + return Arrays.stream(expectedFields).allMatch(expectedField -> {
  67 + // 如果是忽略的属性,则不进行比对
  68 + if (ArrayUtil.contains(ignoreFields, expectedField.getName())) {
  69 + return true;
  70 + }
  71 + // 忽略不存在的属性
  72 + Field actualField = ReflectUtil.getField(actual.getClass(), expectedField.getName());
  73 + if (actualField == null) {
  74 + return true;
  75 + }
  76 + return Objects.equals(ReflectUtil.getFieldValue(expected, expectedField),
  77 + ReflectUtil.getFieldValue(actual, actualField));
  78 + });
  79 + }
  80 +
  81 + /**
54 82 * 执行方法,校验抛出的 Service 是否符合条件
55 83 *
56 84 * @param executable 业务异常
... ...