From 5a7e2f6327fe20229a9ec2ee3289a3c7df0c3adb Mon Sep 17 00:00:00 2001 From: niudehua <657563945@qq.com> Date: Tue, 9 Mar 2021 23:44:25 +0800 Subject: [PATCH] =?UTF-8?q?unit=5Fsystem=5Fdept=20service=20=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handler/DefaultDBFieldHandler.java | 2 +- .../dept/vo/dept/SysDeptBaseVO.java | 2 +- .../dept/vo/post/SysPostBaseVO.java | 3 +- .../dict/vo/data/SysDictDataBaseVO.java | 2 +- .../permission/vo/menu/SysMenuBaseVO.java | 2 +- .../permission/vo/role/SysRoleBaseVO.java | 3 +- .../service/dept/SysDeptServiceTest.java | 274 ++++++++++++++++++ .../service/dept/SysPostServiceTest.java | 200 +++++++++++++ src/test/resources/sql/clean.sql | 1 + src/test/resources/sql/create_tables.sql | 17 ++ 10 files changed, 500 insertions(+), 6 deletions(-) create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java diff --git a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/handler/DefaultDBFieldHandler.java index 06a7a6b38..f87d14b1d 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/handler/DefaultDBFieldHandler.java +++ b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -57,7 +57,7 @@ public class DefaultDBFieldHandler implements MetaObjectHandler { } // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 if (Objects.nonNull(loginUser) && Objects.isNull(modifier)) { - setFieldValByName("updater", loginUser.getId(), metaObject); + setFieldValByName("updater", loginUser.getId().toString(), metaObject); } } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java index 922c395fd..9c54c163f 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/dept/SysDeptBaseVO.java @@ -25,7 +25,7 @@ public class SysDeptBaseVO { private Long parentId; @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "负责人", example = "芋道") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java index 9a7943b0f..2b90c1024 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostBaseVO.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -24,7 +25,7 @@ public class SysPostBaseVO { private String code; @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java index 702eba0ef..b034d9540 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/vo/data/SysDictDataBaseVO.java @@ -15,7 +15,7 @@ import javax.validation.constraints.Size; public class SysDictDataBaseVO { @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "字典标签", required = true, example = "芋道") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java index 5882f825c..c69cec51b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/menu/SysMenuBaseVO.java @@ -28,7 +28,7 @@ public class SysMenuBaseVO { private Integer type; @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java b/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java index bf9a1b141..ade6991fc 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRoleBaseVO.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -24,7 +25,7 @@ public class SysRoleBaseVO { private String code; @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") - @NotBlank(message = "显示顺序不能为空") + @NotNull(message = "显示顺序不能为空") private Integer sort; @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "见 SysRoleTypeEnum 枚举") diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java new file mode 100644 index 000000000..ca0165c0f --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java @@ -0,0 +1,274 @@ +package cn.iocoder.dashboard.modules.system.service.dept; + +import cn.iocoder.dashboard.BaseDbUnitTest; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysDeptMapper; +import cn.iocoder.dashboard.modules.system.enums.dept.DeptIdEnum; +import cn.iocoder.dashboard.modules.system.mq.producer.dept.SysDeptProducer; +import cn.iocoder.dashboard.modules.system.service.dept.impl.SysDeptServiceImpl; +import cn.iocoder.dashboard.util.collection.ArrayUtils; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import com.google.common.collect.Multimap; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import static cn.hutool.core.bean.BeanUtil.getFieldValue; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +/** + * {@link SysDeptServiceImpl} 的单元测试类 + * + * @author niudehua + */ +@Import(SysDeptServiceImpl.class) +class SysDeptServiceTest extends BaseDbUnitTest { + + @Resource + private SysDeptServiceImpl deptService; + @Resource + private SysDeptMapper deptMapper; + @MockBean + private SysDeptProducer deptProducer; + + @Test + @SuppressWarnings("unchecked") + void testInitLocalCache() { + // mock 数据 + SysDeptDO deptDO1 = randomDeptDO(); + deptMapper.insert(deptDO1); + SysDeptDO deptDO2 = randomDeptDO(); + deptMapper.insert(deptDO2); + + // 调用 + deptService.initLocalCache(); + // 断言 deptCache 缓存 + Map deptCache = (Map) getFieldValue(deptService, "deptCache"); + assertEquals(2, deptCache.size()); + assertPojoEquals(deptDO1, deptCache.get(deptDO1.getId())); + assertPojoEquals(deptDO2, deptCache.get(deptDO2.getId())); + // 断言 parentDeptCache 缓存 + Multimap parentDeptCache = (Multimap) getFieldValue(deptService, "parentDeptCache"); + assertEquals(2, parentDeptCache.size()); + assertPojoEquals(deptDO1, parentDeptCache.get(deptDO1.getParentId())); + assertPojoEquals(deptDO2, parentDeptCache.get(deptDO2.getParentId())); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = (Date) getFieldValue(deptService, "maxUpdateTime"); + assertEquals(ObjectUtils.max(deptDO1.getUpdateTime(), deptDO2.getUpdateTime()), maxUpdateTime); + + } + + @Test + void testListDepts() { + // mock 数据 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { // 等会查询到 + o.setName("开发部"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + deptMapper.insert(dept); + // 测试 name 不匹配 + deptMapper.insert(ObjectUtils.clone(dept, o -> o.setName("发"))); + // 测试 status 不匹配 + deptMapper.insert(ObjectUtils.clone(dept, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysDeptListReqVO reqVO = new SysDeptListReqVO(); + reqVO.setName("开"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + // 调用 + List sysDeptDOS = deptService.listDepts(reqVO); + // 断言 + assertEquals(1, sysDeptDOS.size()); + assertPojoEquals(dept, sysDeptDOS.get(0)); + } + + @Test + void testCreateDept_success() { + // 准备参数 + SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + o -> { + o.setParentId(DeptIdEnum.ROOT.getId()); + o.setStatus(randomCommonStatus()); + }); + // 调用 + Long deptId = deptService.createDept(reqVO); + // 断言 + assertNotNull(deptId); + // 校验记录的属性是否正确 + SysDeptDO deptDO = deptMapper.selectById(deptId); + assertPojoEquals(reqVO, deptDO); + // 校验调用 + verify(deptProducer, times(1)).sendDeptRefreshMessage(); + } + + @Test + void testUpdateDept_success() { + // mock 数据 + SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, o -> { + // 设置更新的 ID + o.setParentId(DeptIdEnum.ROOT.getId()); + o.setId(dbDeptDO.getId()); + o.setStatus(randomCommonStatus()); + }); + // 调用 + deptService.updateDept(reqVO); + // 校验是否更新正确 + SysDeptDO deptDO = deptMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, deptDO); + } + + @Test + void testDeleteDept_success() { + // mock 数据 + SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDeptDO.getId(); + // 调用 + deptService.deleteDept(id); + // 校验数据不存在了 + assertNull(deptMapper.selectById(id)); + } + + @Test + void testCheckDept_nameDuplicateForUpdate() { + // mock 数据 + SysDeptDO deptDO = randomDeptDO(); + // 设置根节点部门 + deptDO.setParentId(DeptIdEnum.ROOT.getId()); + deptMapper.insert(deptDO); + // mock 数据 稍后模拟重复它的 name + SysDeptDO nameDeptDO = randomDeptDO(); + // 设置根节点部门 + nameDeptDO.setParentId(DeptIdEnum.ROOT.getId()); + deptMapper.insert(nameDeptDO); + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + o -> { + // 设置根节点部门 + o.setParentId(DeptIdEnum.ROOT.getId()); + // 设置更新的 ID + o.setId(deptDO.getId()); + // 模拟 name 重复 + o.setName(nameDeptDO.getName()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_NAME_DUPLICATE); + + } + + @Test + void testCheckDept_parentNotExitsForCreate() { + SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + o -> o.setStatus(randomCommonStatus())); + // 调用,并断言异常 + assertServiceException(() -> deptService.createDept(reqVO), DEPT_PARENT_NOT_EXITS); + } + + @Test + void testCheckDept_notFoundForDelete() { + // 准备参数 + Long id = randomLongId(); + // 调用, 并断言异常 + assertServiceException(() -> deptService.deleteDept(id), DEPT_NOT_FOUND); + } + + @Test + void testCheckDept_exitsChildrenForDelete() { + // mock 数据 + SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(parentDept);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysDeptDO childrenDeptDO = randomPojo(SysDeptDO.class, o -> { + o.setParentId(parentDept.getId()); + o.setStatus(randomCommonStatus()); + }); + // 插入子部门 + deptMapper.insert(childrenDeptDO); + // 调用, 并断言异常 + assertServiceException(() -> deptService.deleteDept(parentDept.getId()), DEPT_EXITS_CHILDREN); + } + + @Test + void testCheckDept_parentErrorForUpdate() { + // mock 数据 + SysDeptDO dbDeptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO); + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + o -> { + // 设置自己为父部门 + o.setParentId(dbDeptDO.getId()); + // 设置更新的 ID + o.setId(dbDeptDO.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_ERROR); + } + + @Test + void testCheckDept_notEnableForCreate() { + // mock 数据 + SysDeptDO deptDO = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); + deptMapper.insert(deptDO); + // 准备参数 + SysDeptCreateReqVO reqVO = randomPojo(SysDeptCreateReqVO.class, + o -> { + // 设置未启用的部门为副部门 + o.setParentId(deptDO.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.createDept(reqVO), DEPT_NOT_ENABLE); + } + + @Test + void testCheckDept_parentIsChildForUpdate() { + // mock 数据 + SysDeptDO parentDept = randomPojo(SysDeptDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); + deptMapper.insert(parentDept); + SysDeptDO childDept = randomPojo(SysDeptDO.class, o -> { + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(parentDept.getId()); + }); + deptMapper.insert(childDept); + // 初始化本地缓存 + deptService.initLocalCache(); + // 准备参数 + SysDeptUpdateReqVO reqVO = randomPojo(SysDeptUpdateReqVO.class, + o -> { + // 设置自己的子部门为父部门 + o.setParentId(childDept.getId()); + // 设置更新的 ID + o.setId(parentDept.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_IS_CHILD); + } + + @SafeVarargs + private static SysDeptDO randomDeptDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SysDeptDO.class, ArrayUtils.append(consumer, consumers)); + } +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java new file mode 100644 index 000000000..bf3478989 --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostServiceTest.java @@ -0,0 +1,200 @@ +package cn.iocoder.dashboard.modules.system.service.dept; + +import cn.iocoder.dashboard.BaseDbUnitTest; +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostCreateReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostExportReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostPageReqVO; +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostUpdateReqVO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; +import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysPostMapper; +import cn.iocoder.dashboard.modules.system.service.dept.impl.SysPostServiceImpl; +import cn.iocoder.dashboard.util.collection.ArrayUtils; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; +import static cn.iocoder.dashboard.util.RandomUtils.randomLongId; +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link SysPostServiceImpl} 的单元测试类 + * + * @author niudehua + */ +@Import(SysPostServiceImpl.class) +class SysPostServiceTest extends BaseDbUnitTest { + + @Resource + private SysPostServiceImpl postService; + @Resource + private SysPostMapper postMapper; + + @Test + void testPagePosts() { + // mock 数据 + SysPostDO postDO = randomPojo(SysPostDO.class, o -> { + o.setName("码仔"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + postMapper.insert(postDO); + // 测试 name 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setName("程序员"))); + // 测试 status 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + + // 准备参数 + SysPostPageReqVO reqVO = new SysPostPageReqVO(); + reqVO.setName("码"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + PageResult pageResult = postService.pagePosts(reqVO); + + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(postDO, pageResult.getList().get(0)); + } + + @Test + void testListPosts() { + // mock 数据 + SysPostDO postDO = randomPojo(SysPostDO.class, o -> { + o.setName("码仔"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + postMapper.insert(postDO); + // 测试 name 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setName("程序员"))); + // 测试 status 不匹配 + postMapper.insert(ObjectUtils.clone(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + SysPostExportReqVO reqVO = new SysPostExportReqVO(); + reqVO.setName("码"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List list = postService.listPosts(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(postDO, list.get(0)); + } + + @Test + void testGetPost() { + // mock 数据 + SysPostDO dbPostDO = randomPostDO(); + postMapper.insert(dbPostDO); + // 准备参数 + Long id = dbPostDO.getId(); + // 调用 + SysPostDO post = postService.getPost(id); + // 断言 + assertNotNull(post); + assertPojoEquals(dbPostDO, post); + } + + @Test + void testCreatePost_success() { + // 准备参数 + SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, + o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); + // 调用 + Long postId = postService.createPost(reqVO); + // 断言 + assertNotNull(postId); + // 校验记录的属性是否正确 + SysPostDO post = postMapper.selectById(postId); + assertPojoEquals(reqVO, post); + } + + @Test + void testUpdatePost_success() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, + o -> { + // 设置更新的 ID + o.setId(postDO.getId()); + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); + }); + // 调用 + postService.updatePost(reqVO); + // 校验是否更新正确 + SysPostDO post = postMapper.selectById(reqVO.getId());// 获取最新的 + assertPojoEquals(reqVO, post); + } + + @Test + void testDeletePost_success() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO); + // 准备参数 + Long id = postDO.getId(); + // 调用 + postService.deletePost(id); + assertNull(postMapper.selectById(id)); + } + + @Test + void testCheckPost_notFoundForDelete() { + // 准备参数 + Long id = randomLongId(); + // 调用, 并断言异常 + assertServiceException(() -> postService.deletePost(id), POST_NOT_FOUND); + } + + @Test + void testCheckPost_nameDuplicateForCreate() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SysPostCreateReqVO reqVO = randomPojo(SysPostCreateReqVO.class, + // 模拟 name 重复 + o -> o.setName(postDO.getName())); + assertServiceException(() -> postService.createPost(reqVO), POST_NAME_DUPLICATE); + } + + @Test + void testCheckPost_codeDuplicateForUpdate() { + // mock 数据 + SysPostDO postDO = randomPostDO(); + postMapper.insert(postDO); + // mock 数据 稍后模拟重复它的 code + SysPostDO codePostDO = randomPostDO(); + postMapper.insert(codePostDO); + // 准备参数 + SysPostUpdateReqVO reqVO = randomPojo(SysPostUpdateReqVO.class, + o -> { + // 设置更新的 ID + o.setId(postDO.getId()); + // 模拟 code 重复 + o.setCode(codePostDO.getCode()); + }); + // 调用, 并断言异常 + assertServiceException(() -> postService.updatePost(reqVO), POST_CODE_DUPLICATE); + } + + @SafeVarargs + private static SysPostDO randomPostDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SysPostDO.class, ArrayUtils.append(consumer, consumers)); + } +} diff --git a/src/test/resources/sql/clean.sql b/src/test/resources/sql/clean.sql index 110625b54..af50ad635 100644 --- a/src/test/resources/sql/clean.sql +++ b/src/test/resources/sql/clean.sql @@ -9,3 +9,4 @@ DELETE FROM "sys_role_menu"; DELETE FROM "sys_menu"; DELETE FROM "sys_dict_type"; DELETE FROM "sys_user_session"; +DELETE FROM "sys_post"; diff --git a/src/test/resources/sql/create_tables.sql b/src/test/resources/sql/create_tables.sql index 8675ef978..4b1bc78c1 100644 --- a/src/test/resources/sql/create_tables.sql +++ b/src/test/resources/sql/create_tables.sql @@ -129,3 +129,20 @@ CREATE TABLE `sys_user_session` ( "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY (`id`) ) COMMENT '用户在线 Session'; + +CREATE TABLE IF NOT EXISTS "sys_post" +( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) NOT NULL, + "name" varchar(50) NOT NULL, + "sort" integer NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '岗位信息表'; +