Commit 92d3085b1f1eff49e73fb793a47e43d27757df10

Authored by YunaiV
1 parent 4120084c

完成部分 dict data 的单元测试

src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java
@@ -32,7 +32,7 @@ public class SysDictDataController { @@ -32,7 +32,7 @@ public class SysDictDataController {
32 @GetMapping("/list-all-simple") 32 @GetMapping("/list-all-simple")
33 // 无需添加权限认证,因为前端全局都需要 33 // 无需添加权限认证,因为前端全局都需要
34 public CommonResult<List<SysDictDataSimpleVO>> listSimpleDictDatas() { 34 public CommonResult<List<SysDictDataSimpleVO>> listSimpleDictDatas() {
35 - List<SysDictDataDO> list = dictDataService.listDictDatas(); 35 + List<SysDictDataDO> list = dictDataService.getDictDataList();
36 return success(SysDictDataConvert.INSTANCE.convertList(list)); 36 return success(SysDictDataConvert.INSTANCE.convertList(list));
37 } 37 }
38 38
@@ -40,7 +40,7 @@ public class SysDictDataController { @@ -40,7 +40,7 @@ public class SysDictDataController {
40 @GetMapping("/page") 40 @GetMapping("/page")
41 // @PreAuthorize("@ss.hasPermi('system:dict:list')") 41 // @PreAuthorize("@ss.hasPermi('system:dict:list')")
42 public CommonResult<PageResult<SysDictDataRespVO>> pageDictTypes(@Validated SysDictDataPageReqVO reqVO) { 42 public CommonResult<PageResult<SysDictDataRespVO>> pageDictTypes(@Validated SysDictDataPageReqVO reqVO) {
43 - return success(SysDictDataConvert.INSTANCE.convertPage(dictDataService.pageDictDatas(reqVO))); 43 + return success(SysDictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO)));
44 } 44 }
45 45
46 @ApiOperation("/查询字典数据详细") 46 @ApiOperation("/查询字典数据详细")
@@ -83,7 +83,7 @@ public class SysDictDataController { @@ -83,7 +83,7 @@ public class SysDictDataController {
83 // @Log(title = "字典类型", businessType = BusinessType.EXPORT) 83 // @Log(title = "字典类型", businessType = BusinessType.EXPORT)
84 // @PreAuthorize("@ss.hasPermi('system:dict:export')") 84 // @PreAuthorize("@ss.hasPermi('system:dict:export')")
85 public void export(HttpServletResponse response, @Validated SysDictDataExportReqVO reqVO) throws IOException { 85 public void export(HttpServletResponse response, @Validated SysDictDataExportReqVO reqVO) throws IOException {
86 - List<SysDictDataDO> list = dictDataService.listDictDatas(reqVO); 86 + List<SysDictDataDO> list = dictDataService.getDictDataList(reqVO);
87 List<SysDictDataExcelVO> excelDataList = SysDictDataConvert.INSTANCE.convertList02(list); 87 List<SysDictDataExcelVO> excelDataList = SysDictDataConvert.INSTANCE.convertList02(list);
88 // 输出 88 // 输出
89 ExcelUtils.write(response, "字典数据.xls", "数据列表", 89 ExcelUtils.write(response, "字典数据.xls", "数据列表",
src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java
@@ -16,7 +16,7 @@ public class SysDictDataBaseVO { @@ -16,7 +16,7 @@ public class SysDictDataBaseVO {
16 16
17 @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") 17 @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024")
18 @NotBlank(message = "显示顺序不能为空") 18 @NotBlank(message = "显示顺序不能为空")
19 - private String sort; 19 + private Integer sort;
20 20
21 @ApiModelProperty(value = "字典标签", required = true, example = "芋道") 21 @ApiModelProperty(value = "字典标签", required = true, example = "芋道")
22 @NotBlank(message = "字典标签不能为空") 22 @NotBlank(message = "字典标签不能为空")
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
@@ -65,7 +65,7 @@ public interface SysErrorCodeConstants { @@ -65,7 +65,7 @@ public interface SysErrorCodeConstants {
65 ErrorCode DICT_TYPE_HAS_CHILDREN = new ErrorCode(1002006004, "无法删除,该字典类型还有字典数据"); 65 ErrorCode DICT_TYPE_HAS_CHILDREN = new ErrorCode(1002006004, "无法删除,该字典类型还有字典数据");
66 66
67 // ========== 字典数据 1002007000 ========== 67 // ========== 字典数据 1002007000 ==========
68 - ErrorCode DICT_DATA_NOT_FOUND = new ErrorCode(1002007001, "当前字典数据不存在"); 68 + ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1002007001, "当前字典数据不存在");
69 ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1002007002, "字典数据不处于开启状态,不允许选择"); 69 ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1002007002, "字典数据不处于开启状态,不允许选择");
70 ErrorCode DICT_DATA_VALUE_DUPLICATE = new ErrorCode(1002007003, "已经存在该值的字典数据"); 70 ErrorCode DICT_DATA_VALUE_DUPLICATE = new ErrorCode(1002007003, "已经存在该值的字典数据");
71 71
src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java
@@ -27,7 +27,7 @@ public interface SysDictDataService extends DictDataFrameworkService { @@ -27,7 +27,7 @@ public interface SysDictDataService extends DictDataFrameworkService {
27 * 27 *
28 * @return 字典数据全列表 28 * @return 字典数据全列表
29 */ 29 */
30 - List<SysDictDataDO> listDictDatas(); 30 + List<SysDictDataDO> getDictDataList();
31 31
32 /** 32 /**
33 * 获得字典数据分页列表 33 * 获得字典数据分页列表
@@ -35,7 +35,7 @@ public interface SysDictDataService extends DictDataFrameworkService { @@ -35,7 +35,7 @@ public interface SysDictDataService extends DictDataFrameworkService {
35 * @param reqVO 分页请求 35 * @param reqVO 分页请求
36 * @return 字典数据分页列表 36 * @return 字典数据分页列表
37 */ 37 */
38 - PageResult<SysDictDataDO> pageDictDatas(SysDictDataPageReqVO reqVO); 38 + PageResult<SysDictDataDO> getDictDataPage(SysDictDataPageReqVO reqVO);
39 39
40 /** 40 /**
41 * 获得字典数据列表 41 * 获得字典数据列表
@@ -43,7 +43,7 @@ public interface SysDictDataService extends DictDataFrameworkService { @@ -43,7 +43,7 @@ public interface SysDictDataService extends DictDataFrameworkService {
43 * @param reqVO 列表请求 43 * @param reqVO 列表请求
44 * @return 字典数据列表 44 * @return 字典数据列表
45 */ 45 */
46 - List<SysDictDataDO> listDictDatas(SysDictDataExportReqVO reqVO); 46 + List<SysDictDataDO> getDictDataList(SysDictDataExportReqVO reqVO);
47 47
48 /** 48 /**
49 * 获得字典数据详情 49 * 获得字典数据详情
src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java
@@ -130,19 +130,19 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -130,19 +130,19 @@ public class SysDictDataServiceImpl implements SysDictDataService {
130 } 130 }
131 131
132 @Override 132 @Override
133 - public List<SysDictDataDO> listDictDatas() { 133 + public List<SysDictDataDO> getDictDataList() {
134 List<SysDictDataDO> list = dictDataMapper.selectList(); 134 List<SysDictDataDO> list = dictDataMapper.selectList();
135 list.sort(COMPARATOR_TYPE_AND_SORT); 135 list.sort(COMPARATOR_TYPE_AND_SORT);
136 return list; 136 return list;
137 } 137 }
138 138
139 @Override 139 @Override
140 - public PageResult<SysDictDataDO> pageDictDatas(SysDictDataPageReqVO reqVO) { 140 + public PageResult<SysDictDataDO> getDictDataPage(SysDictDataPageReqVO reqVO) {
141 return dictDataMapper.selectPage(reqVO); 141 return dictDataMapper.selectPage(reqVO);
142 } 142 }
143 143
144 @Override 144 @Override
145 - public List<SysDictDataDO> listDictDatas(SysDictDataExportReqVO reqVO) { 145 + public List<SysDictDataDO> getDictDataList(SysDictDataExportReqVO reqVO) {
146 List<SysDictDataDO> list = dictDataMapper.selectList(reqVO); 146 List<SysDictDataDO> list = dictDataMapper.selectList(reqVO);
147 list.sort(COMPARATOR_TYPE_AND_SORT); 147 list.sort(COMPARATOR_TYPE_AND_SORT);
148 return list; 148 return list;
@@ -194,10 +194,10 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -194,10 +194,10 @@ public class SysDictDataServiceImpl implements SysDictDataService {
194 private void checkCreateOrUpdate(Long id, String label, String dictType) { 194 private void checkCreateOrUpdate(Long id, String label, String dictType) {
195 // 校验自己存在 195 // 校验自己存在
196 checkDictDataExists(id); 196 checkDictDataExists(id);
197 - // 校验字典数据的值的唯一性  
198 - checkDictDataValueUnique(id, dictType, label);  
199 // 校验字典类型有效 197 // 校验字典类型有效
200 checkDictTypeValid(dictType); 198 checkDictTypeValid(dictType);
  199 + // 校验字典数据的值的唯一性
  200 + checkDictDataValueUnique(id, dictType, label);
201 } 201 }
202 202
203 private void checkDictDataValueUnique(Long id, String dictType, String label) { 203 private void checkDictDataValueUnique(Long id, String dictType, String label) {
@@ -220,7 +220,7 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -220,7 +220,7 @@ public class SysDictDataServiceImpl implements SysDictDataService {
220 } 220 }
221 SysDictDataDO dictData = dictDataMapper.selectById(id); 221 SysDictDataDO dictData = dictDataMapper.selectById(id);
222 if (dictData == null) { 222 if (dictData == null) {
223 - throw ServiceExceptionUtil.exception(DICT_DATA_NOT_FOUND); 223 + throw ServiceExceptionUtil.exception(DICT_DATA_NOT_EXISTS);
224 } 224 }
225 } 225 }
226 226
src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.dict;
  2 +
  3 +import cn.iocoder.dashboard.BaseSpringBootUnitTest;
  4 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
  5 +import cn.iocoder.dashboard.common.pojo.PageResult;
  6 +import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataExportReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataPageReqVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO;
  10 +import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO;
  11 +import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO;
  12 +import cn.iocoder.dashboard.modules.system.dal.mysql.dict.SysDictDataMapper;
  13 +import cn.iocoder.dashboard.modules.system.mq.producer.dict.SysDictDataProducer;
  14 +import cn.iocoder.dashboard.modules.system.service.dict.impl.SysDictDataServiceImpl;
  15 +import cn.iocoder.dashboard.util.object.ObjectUtils;
  16 +import org.junit.jupiter.api.Test;
  17 +import org.springframework.boot.test.mock.mockito.MockBean;
  18 +
  19 +import javax.annotation.Resource;
  20 +import java.util.List;
  21 +
  22 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.DICT_DATA_NOT_EXISTS;
  23 +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
  24 +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
  25 +import static cn.iocoder.dashboard.util.RandomUtils.*;
  26 +import static org.junit.jupiter.api.Assertions.*;
  27 +import static org.mockito.ArgumentMatchers.eq;
  28 +import static org.mockito.Mockito.*;
  29 +
  30 +/**
  31 +* {@link SysDictDataServiceImpl} 的单元测试类
  32 +*
  33 +* @author 芋道源码
  34 +*/
  35 +public class SysDictDataServiceTest extends BaseSpringBootUnitTest {
  36 +
  37 + @Resource
  38 + private SysDictDataServiceImpl dictDataService;
  39 +
  40 + @Resource
  41 + private SysDictDataMapper dictDataMapper;
  42 + @MockBean
  43 + private SysDictTypeService dictTypeService;
  44 + @MockBean
  45 + private SysDictDataProducer dictDataProducer;
  46 +
  47 + @Test
  48 + public void testGetDictDataPage() {
  49 + // mock 数据
  50 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到
  51 + o.setLabel("芋艿");
  52 + o.setDictType("yunai");
  53 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  54 + });
  55 + dictDataMapper.insert(dbDictData);
  56 + // 测试 label 不匹配
  57 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setLabel("艿")));
  58 + // 测试 dictType 不匹配
  59 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setDictType("nai")));
  60 + // 测试 status 不匹配
  61 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
  62 + // 准备参数
  63 + SysDictDataPageReqVO reqVO = new SysDictDataPageReqVO();
  64 + reqVO.setLabel("芋");
  65 + reqVO.setDictType("yu");
  66 + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  67 +
  68 + // 调用
  69 + PageResult<SysDictDataDO> pageResult = dictDataService.getDictDataPage(reqVO);
  70 + // 断言
  71 + assertEquals(1, pageResult.getTotal());
  72 + assertEquals(1, pageResult.getList().size());
  73 + assertPojoEquals(dbDictData, pageResult.getList().get(0));
  74 + }
  75 +
  76 + @Test
  77 + public void testGetDictDataList() {
  78 + // mock 数据
  79 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class, o -> { // 等会查询到
  80 + o.setLabel("芋艿");
  81 + o.setDictType("yunai");
  82 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  83 + });
  84 + dictDataMapper.insert(dbDictData);
  85 + // 测试 label 不匹配
  86 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setLabel("艿")));
  87 + // 测试 dictType 不匹配
  88 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setDictType("nai")));
  89 + // 测试 status 不匹配
  90 + dictDataMapper.insert(ObjectUtils.clone(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
  91 + // 准备参数
  92 + SysDictDataExportReqVO reqVO = new SysDictDataExportReqVO();
  93 + reqVO.setLabel("芋");
  94 + reqVO.setDictType("yu");
  95 + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  96 +
  97 + // 调用
  98 + List<SysDictDataDO> list = dictDataService.getDictDataList(reqVO);
  99 + // 断言
  100 + assertEquals(1, list.size());
  101 + assertPojoEquals(dbDictData, list.get(0));
  102 + }
  103 +
  104 + @Test
  105 + public void testCreateDictData_success() {
  106 + // 准备参数
  107 + SysDictDataCreateReqVO reqVO = randomPojo(SysDictDataCreateReqVO.class,
  108 + o -> o.setStatus(randomCommonStatus()));
  109 + // mock 方法
  110 + when(dictTypeService.getDictType(eq(reqVO.getDictType())))
  111 + .thenReturn(randomPojo(SysDictTypeDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())));
  112 +
  113 + // 调用
  114 + Long dictDataId = dictDataService.createDictData(reqVO);
  115 + // 断言
  116 + assertNotNull(dictDataId);
  117 + // 校验记录的属性是否正确
  118 + SysDictDataDO dictData = dictDataMapper.selectById(dictDataId);
  119 + assertPojoEquals(reqVO, dictData);
  120 + // 校验调用
  121 + verify(dictDataProducer, times(1)).sendDictDataRefreshMessage();
  122 + }
  123 +
  124 + @Test
  125 + public void testUpdateDictData_success() {
  126 + // mock 数据
  127 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class);
  128 + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据
  129 + // 准备参数
  130 + SysDictDataUpdateReqVO reqVO = randomPojo(SysDictDataUpdateReqVO.class, o -> {
  131 + o.setId(dbDictData.getId()); // 设置更新的 ID
  132 + });
  133 +
  134 + // 调用
  135 + dictDataService.updateDictData(reqVO);
  136 + // 校验是否更新正确
  137 + SysDictDataDO dictData = dictDataMapper.selectById(reqVO.getId()); // 获取最新的
  138 + assertPojoEquals(reqVO, dictData);
  139 + }
  140 +
  141 + @Test
  142 + public void testUpdateDictData_notExists() {
  143 + // 准备参数
  144 + SysDictDataUpdateReqVO reqVO = randomPojo(SysDictDataUpdateReqVO.class);
  145 +
  146 + // 调用, 并断言异常
  147 + assertServiceException(() -> dictDataService.updateDictData(reqVO), DICT_DATA_NOT_EXISTS);
  148 + }
  149 +
  150 + @Test
  151 + public void testDeleteDictData_success() {
  152 + // mock 数据
  153 + SysDictDataDO dbDictData = randomPojo(SysDictDataDO.class);
  154 + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据
  155 + // 准备参数
  156 + Long id = dbDictData.getId();
  157 +
  158 + // 调用
  159 + dictDataService.deleteDictData(id);
  160 + // 校验数据不存在了
  161 + assertNull(dictDataMapper.selectById(id));
  162 + }
  163 +
  164 + @Test
  165 + public void testDeleteDictData_notExists() {
  166 + // 准备参数
  167 + Long id = randomLongId();
  168 +
  169 + // 调用, 并断言异常
  170 + assertServiceException(() -> dictDataService.deleteDictData(id), DICT_DATA_NOT_EXISTS);
  171 + }
  172 +
  173 +}
src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java
@@ -33,7 +33,7 @@ import static org.mockito.Mockito.when; @@ -33,7 +33,7 @@ import static org.mockito.Mockito.when;
33 /** 33 /**
34 * {@link SysDictTypeServiceImpl} 的单元测试类 34 * {@link SysDictTypeServiceImpl} 的单元测试类
35 * 35 *
36 -* @author 芋艿 36 +* @author 芋道源码
37 */ 37 */
38 public class SysDictTypeServiceTest extends BaseSpringBootUnitTest { 38 public class SysDictTypeServiceTest extends BaseSpringBootUnitTest {
39 39
src/test/java/cn/iocoder/dashboard/util/RandomUtils.java
@@ -2,6 +2,7 @@ package cn.iocoder.dashboard.util; @@ -2,6 +2,7 @@ package cn.iocoder.dashboard.util;
2 2
3 import cn.hutool.core.util.ArrayUtil; 3 import cn.hutool.core.util.ArrayUtil;
4 import cn.hutool.core.util.RandomUtil; 4 import cn.hutool.core.util.RandomUtil;
  5 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
5 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 6 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
6 import uk.co.jemos.podam.api.PodamFactory; 7 import uk.co.jemos.podam.api.PodamFactory;
7 import uk.co.jemos.podam.api.PodamFactoryImpl; 8 import uk.co.jemos.podam.api.PodamFactoryImpl;
@@ -67,6 +68,10 @@ public class RandomUtils { @@ -67,6 +68,10 @@ public class RandomUtils {
67 .map(i -> randomPojo(clazz)).collect(Collectors.toSet()); 68 .map(i -> randomPojo(clazz)).collect(Collectors.toSet());
68 } 69 }
69 70
  71 + public static Integer randomCommonStatus() {
  72 + return RandomUtil.randomEle(CommonStatusEnum.values()).getStatus();
  73 + }
  74 +
70 @SafeVarargs 75 @SafeVarargs
71 public static SysUserDO randomUserDO(Consumer<SysUserDO>... consumers) { 76 public static SysUserDO randomUserDO(Consumer<SysUserDO>... consumers) {
72 return randomPojo(SysUserDO.class, consumers); 77 return randomPojo(SysUserDO.class, consumers);