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,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 业务异常