Commit 6aeeeac90ffbbfdbd1f89333d9d830e6ae9b1138
1 parent
953d270d
增加 sms 的缓存的单元测试
Showing
5 changed files
with
123 additions
and
29 deletions
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,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.service.permission; | ||
| 3 | import cn.hutool.core.bean.BeanUtil; | 3 | import cn.hutool.core.bean.BeanUtil; |
| 4 | import cn.hutool.core.lang.Assert; | 4 | import cn.hutool.core.lang.Assert; |
| 5 | import cn.iocoder.dashboard.BaseDbUnitTest; | 5 | import cn.iocoder.dashboard.BaseDbUnitTest; |
| 6 | +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | ||
| 6 | import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; | 7 | import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO; |
| 7 | import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuListReqVO; | 8 | import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuListReqVO; |
| 8 | import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; | 9 | import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO; |
| @@ -52,18 +53,20 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | @@ -52,18 +53,20 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | ||
| 52 | SysMenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); | 53 | SysMenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); |
| 53 | menuMapper.insert(menuDO2); | 54 | menuMapper.insert(menuDO2); |
| 54 | 55 | ||
| 55 | - //调用 | 56 | + // 调用 |
| 56 | sysMenuService.initLocalCache(); | 57 | sysMenuService.initLocalCache(); |
| 57 | 58 | ||
| 58 | // 获取代理对象 | 59 | // 获取代理对象 |
| 59 | SysMenuServiceImpl target = (SysMenuServiceImpl) AopTargetUtils.getTarget(sysMenuService); | 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 | Assert.isTrue(menuCache.size() == 2); | 64 | Assert.isTrue(menuCache.size() == 2); |
| 63 | assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId())); | 65 | assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId())); |
| 64 | assertPojoEquals(menuDO2, menuCache.get(menuDO2.getId())); | 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 | Assert.isTrue(permissionMenuCache.size() == 2); | 70 | Assert.isTrue(permissionMenuCache.size() == 2); |
| 68 | assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission())); | 71 | assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission())); |
| 69 | assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission())); | 72 | assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission())); |
| @@ -184,10 +187,9 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | @@ -184,10 +187,9 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | ||
| 184 | 187 | ||
| 185 | //断言 | 188 | //断言 |
| 186 | Assert.isTrue(menuDOS.size() == idMenuMap.size()); | 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 | @Test | 193 | @Test |
| 192 | public void testGetMenusReqVo_success() { | 194 | public void testGetMenusReqVo_success() { |
| 193 | Map<Long, SysMenuDO> idMenuMap = new HashMap<>(); | 195 | Map<Long, SysMenuDO> idMenuMap = new HashMap<>(); |
| @@ -218,7 +220,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | @@ -218,7 +220,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | ||
| 218 | 220 | ||
| 219 | //断言 | 221 | //断言 |
| 220 | Assert.isTrue(menuDOS.size() == idMenuMap.size()); | 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 | @Test | 226 | @Test |
| @@ -244,12 +246,12 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | @@ -244,12 +246,12 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | ||
| 244 | menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); | 246 | menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); |
| 245 | mockCacheMap.put(menuDO.getId(), menuDO); | 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 | Assert.isTrue(menuDOS.size() == idMenuMap.size()); | 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 | @Test | 255 | @Test |
| 254 | public void testListMenusFromCache2_success() throws Exception { | 256 | public void testListMenusFromCache2_success() throws Exception { |
| 255 | Map<Long, SysMenuDO> mockCacheMap = new HashMap<>(); | 257 | Map<Long, SysMenuDO> mockCacheMap = new HashMap<>(); |
| @@ -306,14 +308,14 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | @@ -306,14 +308,14 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | ||
| 306 | } | 308 | } |
| 307 | 309 | ||
| 308 | @Test | 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 | @Test | 321 | @Test |
| @@ -324,7 +326,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | @@ -324,7 +326,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest { | ||
| 324 | Long otherSonMenuId=randomLongId(); | 326 | Long otherSonMenuId=randomLongId(); |
| 325 | String otherSonMenuName=sonMenu.getName(); //相同名称 | 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,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 | package cn.iocoder.dashboard.modules.system.service.sms; | 1 | package cn.iocoder.dashboard.modules.system.service.sms; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.bean.BeanUtil; | ||
| 3 | import cn.iocoder.dashboard.BaseDbUnitTest; | 4 | import cn.iocoder.dashboard.BaseDbUnitTest; |
| 4 | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | 5 | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; |
| 5 | import cn.iocoder.dashboard.common.pojo.PageResult; | 6 | import cn.iocoder.dashboard.common.pojo.PageResult; |
| @@ -9,6 +10,7 @@ import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChann | @@ -9,6 +10,7 @@ import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChann | ||
| 9 | import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; | 10 | import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO; |
| 10 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; | 11 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; |
| 11 | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper; | 12 | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper; |
| 13 | +import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; | ||
| 12 | import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsChannelServiceImpl; | 14 | import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsChannelServiceImpl; |
| 13 | import cn.iocoder.dashboard.util.collection.ArrayUtils; | 15 | import cn.iocoder.dashboard.util.collection.ArrayUtils; |
| 14 | import cn.iocoder.dashboard.util.object.ObjectUtils; | 16 | import cn.iocoder.dashboard.util.object.ObjectUtils; |
| @@ -17,18 +19,19 @@ import org.springframework.boot.test.mock.mockito.MockBean; | @@ -17,18 +19,19 @@ import org.springframework.boot.test.mock.mockito.MockBean; | ||
| 17 | import org.springframework.context.annotation.Import; | 19 | import org.springframework.context.annotation.Import; |
| 18 | 20 | ||
| 19 | import javax.annotation.Resource; | 21 | import javax.annotation.Resource; |
| 22 | +import java.util.Date; | ||
| 20 | import java.util.function.Consumer; | 23 | import java.util.function.Consumer; |
| 21 | 24 | ||
| 22 | import static cn.hutool.core.util.RandomUtil.randomEle; | 25 | import static cn.hutool.core.util.RandomUtil.randomEle; |
| 23 | import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; | 26 | import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; |
| 24 | import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; | 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 | import static cn.iocoder.dashboard.util.RandomUtils.*; | 29 | import static cn.iocoder.dashboard.util.RandomUtils.*; |
| 28 | import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; | 30 | import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; |
| 31 | +import static cn.iocoder.dashboard.util.object.ObjectUtils.max; | ||
| 29 | import static org.junit.jupiter.api.Assertions.*; | 32 | import static org.junit.jupiter.api.Assertions.*; |
| 30 | import static org.mockito.ArgumentMatchers.eq; | 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 | * {@link SysSmsChannelServiceImpl} 的单元测试类 | 37 | * {@link SysSmsChannelServiceImpl} 的单元测试类 |
| @@ -41,14 +44,35 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { | @@ -41,14 +44,35 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { | ||
| 41 | @Resource | 44 | @Resource |
| 42 | private SysSmsChannelServiceImpl smsChannelService; | 45 | private SysSmsChannelServiceImpl smsChannelService; |
| 43 | 46 | ||
| 44 | - @MockBean | ||
| 45 | - private SmsClientFactory smsClientFactory; | ||
| 46 | - | ||
| 47 | @Resource | 47 | @Resource |
| 48 | private SysSmsChannelMapper smsChannelMapper; | 48 | private SysSmsChannelMapper smsChannelMapper; |
| 49 | 49 | ||
| 50 | @MockBean | 50 | @MockBean |
| 51 | + private SmsClientFactory smsClientFactory; | ||
| 52 | + @MockBean | ||
| 51 | private SysSmsTemplateService smsTemplateService; | 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 | @Test | 77 | @Test |
| 54 | public void testCreateSmsChannel_success() { | 78 | public void testCreateSmsChannel_success() { |
| @@ -62,6 +86,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { | @@ -62,6 +86,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { | ||
| 62 | // 校验记录的属性是否正确 | 86 | // 校验记录的属性是否正确 |
| 63 | SysSmsChannelDO smsChannel = smsChannelMapper.selectById(smsChannelId); | 87 | SysSmsChannelDO smsChannel = smsChannelMapper.selectById(smsChannelId); |
| 64 | assertPojoEquals(reqVO, smsChannel); | 88 | assertPojoEquals(reqVO, smsChannel); |
| 89 | + // 校验调用 | ||
| 90 | + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); | ||
| 65 | } | 91 | } |
| 66 | 92 | ||
| 67 | @Test | 93 | @Test |
| @@ -81,6 +107,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { | @@ -81,6 +107,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { | ||
| 81 | // 校验是否更新正确 | 107 | // 校验是否更新正确 |
| 82 | SysSmsChannelDO smsChannel = smsChannelMapper.selectById(reqVO.getId()); // 获取最新的 | 108 | SysSmsChannelDO smsChannel = smsChannelMapper.selectById(reqVO.getId()); // 获取最新的 |
| 83 | assertPojoEquals(reqVO, smsChannel); | 109 | assertPojoEquals(reqVO, smsChannel); |
| 110 | + // 校验调用 | ||
| 111 | + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); | ||
| 84 | } | 112 | } |
| 85 | 113 | ||
| 86 | @Test | 114 | @Test |
| @@ -104,6 +132,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { | @@ -104,6 +132,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { | ||
| 104 | smsChannelService.deleteSmsChannel(id); | 132 | smsChannelService.deleteSmsChannel(id); |
| 105 | // 校验数据不存在了 | 133 | // 校验数据不存在了 |
| 106 | assertNull(smsChannelMapper.selectById(id)); | 134 | assertNull(smsChannelMapper.selectById(id)); |
| 135 | + // 校验调用 | ||
| 136 | + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); | ||
| 107 | } | 137 | } |
| 108 | 138 | ||
| 109 | @Test | 139 | @Test |
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogServiceTest.java
| @@ -109,6 +109,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest { | @@ -109,6 +109,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest { | ||
| 109 | assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo()); | 109 | assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo()); |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | + @Test | ||
| 112 | public void testUpdateSmsReceiveResult() { | 113 | public void testUpdateSmsReceiveResult() { |
| 113 | // mock 数据 | 114 | // mock 数据 |
| 114 | SysSmsLogDO dbSmsLog = randomSmsLogDO( | 115 | SysSmsLogDO dbSmsLog = randomSmsLogDO( |
| @@ -128,7 +129,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest { | @@ -128,7 +129,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest { | ||
| 128 | assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus() | 129 | assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus() |
| 129 | : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus()); | 130 | : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus()); |
| 130 | assertEquals(receiveTime, dbSmsLog.getReceiveTime()); | 131 | assertEquals(receiveTime, dbSmsLog.getReceiveTime()); |
| 131 | - assertEquals(apiReceiveCode, dbSmsLog.getApiSendCode()); | 132 | + assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode()); |
| 132 | assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg()); | 133 | assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg()); |
| 133 | } | 134 | } |
| 134 | 135 | ||
| @@ -233,6 +234,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest { | @@ -233,6 +234,7 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest { | ||
| 233 | o.setTemplateParams(randomTemplateParams()); | 234 | o.setTemplateParams(randomTemplateParams()); |
| 234 | o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围 | 235 | o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围 |
| 235 | o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围 | 236 | o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围 |
| 237 | + o.setSendStatus(randomEle(SysSmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围 | ||
| 236 | o.setReceiveStatus(randomEle(SysSmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围 | 238 | o.setReceiveStatus(randomEle(SysSmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围 |
| 237 | }; | 239 | }; |
| 238 | return randomPojo(SysSmsLogDO.class, ArrayUtils.append(consumer, consumers)); | 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,6 +16,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; | ||
| 16 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; | 16 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; |
| 17 | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper; | 17 | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper; |
| 18 | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum; | 18 | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum; |
| 19 | +import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; | ||
| 19 | import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsTemplateServiceImpl; | 20 | import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsTemplateServiceImpl; |
| 20 | import cn.iocoder.dashboard.util.collection.ArrayUtils; | 21 | import cn.iocoder.dashboard.util.collection.ArrayUtils; |
| 21 | import cn.iocoder.dashboard.util.object.ObjectUtils; | 22 | import cn.iocoder.dashboard.util.object.ObjectUtils; |
| @@ -25,18 +26,22 @@ import org.springframework.boot.test.mock.mockito.MockBean; | @@ -25,18 +26,22 @@ import org.springframework.boot.test.mock.mockito.MockBean; | ||
| 25 | import org.springframework.context.annotation.Import; | 26 | import org.springframework.context.annotation.Import; |
| 26 | 27 | ||
| 27 | import javax.annotation.Resource; | 28 | import javax.annotation.Resource; |
| 29 | +import java.util.Date; | ||
| 28 | import java.util.List; | 30 | import java.util.List; |
| 31 | +import java.util.Map; | ||
| 29 | import java.util.function.Consumer; | 32 | import java.util.function.Consumer; |
| 30 | 33 | ||
| 34 | +import static cn.hutool.core.bean.BeanUtil.getFieldValue; | ||
| 31 | import static cn.hutool.core.util.RandomUtil.randomEle; | 35 | import static cn.hutool.core.util.RandomUtil.randomEle; |
| 32 | import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; | 36 | import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; |
| 33 | import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; | 37 | import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; |
| 34 | import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; | 38 | import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; |
| 35 | import static cn.iocoder.dashboard.util.RandomUtils.*; | 39 | import static cn.iocoder.dashboard.util.RandomUtils.*; |
| 36 | import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; | 40 | import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; |
| 41 | +import static cn.iocoder.dashboard.util.object.ObjectUtils.max; | ||
| 37 | import static org.junit.jupiter.api.Assertions.*; | 42 | import static org.junit.jupiter.api.Assertions.*; |
| 38 | import static org.mockito.ArgumentMatchers.eq; | 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 | * {@link SysSmsTemplateServiceImpl} 的单元测试类 | 47 | * {@link SysSmsTemplateServiceImpl} 的单元测试类 |
| @@ -54,11 +59,33 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | @@ -54,11 +59,33 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 54 | 59 | ||
| 55 | @MockBean | 60 | @MockBean |
| 56 | private SysSmsChannelService smsChannelService; | 61 | private SysSmsChannelService smsChannelService; |
| 57 | - | ||
| 58 | @MockBean | 62 | @MockBean |
| 59 | private SmsClientFactory smsClientFactory; | 63 | private SmsClientFactory smsClientFactory; |
| 60 | @MockBean | 64 | @MockBean |
| 61 | private SmsClient smsClient; | 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 | @Test | 90 | @Test |
| 64 | public void testParseTemplateContentParams() { | 91 | public void testParseTemplateContentParams() { |
| @@ -101,6 +128,8 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | @@ -101,6 +128,8 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 101 | assertPojoEquals(reqVO, smsTemplate); | 128 | assertPojoEquals(reqVO, smsTemplate); |
| 102 | assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); | 129 | assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); |
| 103 | assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); | 130 | assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); |
| 131 | + // 校验调用 | ||
| 132 | + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); | ||
| 104 | } | 133 | } |
| 105 | 134 | ||
| 106 | @Test | 135 | @Test |
| @@ -134,6 +163,8 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | @@ -134,6 +163,8 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 134 | assertPojoEquals(reqVO, smsTemplate); | 163 | assertPojoEquals(reqVO, smsTemplate); |
| 135 | assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); | 164 | assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); |
| 136 | assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); | 165 | assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); |
| 166 | + // 校验调用 | ||
| 167 | + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); | ||
| 137 | } | 168 | } |
| 138 | 169 | ||
| 139 | @Test | 170 | @Test |
| @@ -157,6 +188,8 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | @@ -157,6 +188,8 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 157 | smsTemplateService.deleteSmsTemplate(id); | 188 | smsTemplateService.deleteSmsTemplate(id); |
| 158 | // 校验数据不存在了 | 189 | // 校验数据不存在了 |
| 159 | assertNull(smsTemplateMapper.selectById(id)); | 190 | assertNull(smsTemplateMapper.selectById(id)); |
| 191 | + // 校验调用 | ||
| 192 | + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); | ||
| 160 | } | 193 | } |
| 161 | 194 | ||
| 162 | @Test | 195 | @Test |
| @@ -309,7 +342,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | @@ -309,7 +342,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 309 | } | 342 | } |
| 310 | 343 | ||
| 311 | @Test | 344 | @Test |
| 312 | - public void testCheckDictDataValueUnique_valueDuplicateForCreate() { | 345 | + public void testCheckSmsTemplateCodeDuplicate_valueDuplicateForCreate() { |
| 313 | // 准备参数 | 346 | // 准备参数 |
| 314 | String code = randomString(); | 347 | String code = randomString(); |
| 315 | // mock 数据 | 348 | // mock 数据 |
| @@ -317,7 +350,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | @@ -317,7 +350,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 317 | 350 | ||
| 318 | // 调用,校验异常 | 351 | // 调用,校验异常 |
| 319 | assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(null, code), | 352 | assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(null, code), |
| 320 | - SMS_TEMPLATE_CODE_DUPLICATE); | 353 | + SMS_TEMPLATE_CODE_DUPLICATE, code); |
| 321 | } | 354 | } |
| 322 | 355 | ||
| 323 | @Test | 356 | @Test |
| @@ -330,7 +363,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | @@ -330,7 +363,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 330 | 363 | ||
| 331 | // 调用,校验异常 | 364 | // 调用,校验异常 |
| 332 | assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(id, code), | 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,6 +10,7 @@ import org.junit.jupiter.api.function.Executable; | ||
| 10 | 10 | ||
| 11 | import java.lang.reflect.Field; | 11 | import java.lang.reflect.Field; |
| 12 | import java.util.Arrays; | 12 | import java.util.Arrays; |
| 13 | +import java.util.Objects; | ||
| 13 | 14 | ||
| 14 | import static org.junit.jupiter.api.Assertions.assertThrows; | 15 | import static org.junit.jupiter.api.Assertions.assertThrows; |
| 15 | 16 | ||
| @@ -51,6 +52,33 @@ public class AssertUtils { | @@ -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 | * 执行方法,校验抛出的 Service 是否符合条件 | 82 | * 执行方法,校验抛出的 Service 是否符合条件 |
| 55 | * | 83 | * |
| 56 | * @param executable 业务异常 | 84 | * @param executable 业务异常 |