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 32 @GetMapping("/list-all-simple")
33 33 // 无需添加权限认证,因为前端全局都需要
34 34 public CommonResult<List<SysDictDataSimpleVO>> listSimpleDictDatas() {
35   - List<SysDictDataDO> list = dictDataService.listDictDatas();
  35 + List<SysDictDataDO> list = dictDataService.getDictDataList();
36 36 return success(SysDictDataConvert.INSTANCE.convertList(list));
37 37 }
38 38  
... ... @@ -40,7 +40,7 @@ public class SysDictDataController {
40 40 @GetMapping("/page")
41 41 // @PreAuthorize("@ss.hasPermi('system:dict:list')")
42 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 46 @ApiOperation("/查询字典数据详细")
... ... @@ -83,7 +83,7 @@ public class SysDictDataController {
83 83 // @Log(title = "字典类型", businessType = BusinessType.EXPORT)
84 84 // @PreAuthorize("@ss.hasPermi('system:dict:export')")
85 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 87 List<SysDictDataExcelVO> excelDataList = SysDictDataConvert.INSTANCE.convertList02(list);
88 88 // 输出
89 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 16  
17 17 @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024")
18 18 @NotBlank(message = "显示顺序不能为空")
19   - private String sort;
  19 + private Integer sort;
20 20  
21 21 @ApiModelProperty(value = "字典标签", required = true, example = "芋道")
22 22 @NotBlank(message = "字典标签不能为空")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
... ... @@ -65,7 +65,7 @@ public interface SysErrorCodeConstants {
65 65 ErrorCode DICT_TYPE_HAS_CHILDREN = new ErrorCode(1002006004, "无法删除,该字典类型还有字典数据");
66 66  
67 67 // ========== 字典数据 1002007000 ==========
68   - ErrorCode DICT_DATA_NOT_FOUND = new ErrorCode(1002007001, "当前字典数据不存在");
  68 + ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1002007001, "当前字典数据不存在");
69 69 ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1002007002, "字典数据不处于开启状态,不允许选择");
70 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 27 *
28 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 35 * @param reqVO 分页请求
36 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 43 * @param reqVO 列表请求
44 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 130 }
131 131  
132 132 @Override
133   - public List<SysDictDataDO> listDictDatas() {
  133 + public List<SysDictDataDO> getDictDataList() {
134 134 List<SysDictDataDO> list = dictDataMapper.selectList();
135 135 list.sort(COMPARATOR_TYPE_AND_SORT);
136 136 return list;
137 137 }
138 138  
139 139 @Override
140   - public PageResult<SysDictDataDO> pageDictDatas(SysDictDataPageReqVO reqVO) {
  140 + public PageResult<SysDictDataDO> getDictDataPage(SysDictDataPageReqVO reqVO) {
141 141 return dictDataMapper.selectPage(reqVO);
142 142 }
143 143  
144 144 @Override
145   - public List<SysDictDataDO> listDictDatas(SysDictDataExportReqVO reqVO) {
  145 + public List<SysDictDataDO> getDictDataList(SysDictDataExportReqVO reqVO) {
146 146 List<SysDictDataDO> list = dictDataMapper.selectList(reqVO);
147 147 list.sort(COMPARATOR_TYPE_AND_SORT);
148 148 return list;
... ... @@ -194,10 +194,10 @@ public class SysDictDataServiceImpl implements SysDictDataService {
194 194 private void checkCreateOrUpdate(Long id, String label, String dictType) {
195 195 // 校验自己存在
196 196 checkDictDataExists(id);
197   - // 校验字典数据的值的唯一性
198   - checkDictDataValueUnique(id, dictType, label);
199 197 // 校验字典类型有效
200 198 checkDictTypeValid(dictType);
  199 + // 校验字典数据的值的唯一性
  200 + checkDictDataValueUnique(id, dictType, label);
201 201 }
202 202  
203 203 private void checkDictDataValueUnique(Long id, String dictType, String label) {
... ... @@ -220,7 +220,7 @@ public class SysDictDataServiceImpl implements SysDictDataService {
220 220 }
221 221 SysDictDataDO dictData = dictDataMapper.selectById(id);
222 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 33 /**
34 34 * {@link SysDictTypeServiceImpl} 的单元测试类
35 35 *
36   -* @author 芋艿
  36 +* @author 芋道源码
37 37 */
38 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 2  
3 3 import cn.hutool.core.util.ArrayUtil;
4 4 import cn.hutool.core.util.RandomUtil;
  5 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
5 6 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
6 7 import uk.co.jemos.podam.api.PodamFactory;
7 8 import uk.co.jemos.podam.api.PodamFactoryImpl;
... ... @@ -67,6 +68,10 @@ public class RandomUtils {
67 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 75 @SafeVarargs
71 76 public static SysUserDO randomUserDO(Consumer<SysUserDO>... consumers) {
72 77 return randomPojo(SysUserDO.class, consumers);
... ...