Commit 92d3085b1f1eff49e73fb793a47e43d27757df10
1 parent
4120084c
完成部分 dict data 的单元测试
Showing
8 changed files
with
193 additions
and
15 deletions
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
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); | ... | ... |