修复工作流的单元测试

This commit is contained in:
YunaiV 2022-01-23 12:27:27 +08:00
parent 4be5b73dbc
commit fcd44d8b0d
13 changed files with 122 additions and 58 deletions

View File

@ -23,7 +23,7 @@ public interface SysDeptMapper extends BaseMapperX<SysDeptDO> {
default SysDeptDO selectByParentIdAndName(Long parentId, String name) {
return selectOne(new LambdaQueryWrapper<SysDeptDO>().eq(SysDeptDO::getParentId, parentId)
.eq(SysDeptDO::getParentId, name));
.eq(SysDeptDO::getName, name));
}
default Integer selectCountByParentId(Long parentId) {

View File

@ -24,7 +24,7 @@ public interface SysMenuMapper extends BaseMapperX<SysMenuDO> {
}
default List<SysMenuDO> selectList(SysMenuListReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<SysMenuDO>().likeIfPresent(SysMenuDO::getParentId, reqVO.getName())
return selectList(new LambdaQueryWrapperX<SysMenuDO>().likeIfPresent(SysMenuDO::getName, reqVO.getName())
.eqIfPresent(SysMenuDO::getStatus, reqVO.getStatus()));
}

View File

@ -17,6 +17,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntityImpl;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
@ -70,7 +71,7 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest {
// mock 方法
List<SysUserDO> users = CollectionUtils.convertList(asSet(11L, 22L),
id -> new SysUserDO().setId(id));
when(userService.getUsersByPostIds(eq(rule.getOptions()))).thenReturn(users);
when(userService.getUsersByDeptIds(eq(rule.getOptions()))).thenReturn(users);
mockGetUserMap(asSet(11L, 22L));
// 调用
@ -185,10 +186,11 @@ public class BpmUserTaskActivitiBehaviorTest extends BaseMockitoUnitTest {
@Test
public void testRemoveDisableUsers() {
// 准备参数
// 准备参数. 1L 可以找到2L 是禁用的3L 找不到
Set<Long> assigneeUserIds = asSet(1L, 2L, 3L);
// mock 方法
SysUserDO user1 = randomPojo(SysUserDO.class, o -> o.setId(1L));
SysUserDO user1 = randomPojo(SysUserDO.class, o -> o.setId(1L)
.setStatus(CommonStatusEnum.ENABLE.getStatus()));
SysUserDO user2 = randomPojo(SysUserDO.class, o -> o.setId(2L)
.setStatus(CommonStatusEnum.DISABLE.getStatus()));
Map<Long, SysUserDO> userMap = MapUtil.builder(user1.getId(), user1)

View File

@ -1,18 +1,30 @@
package cn.iocoder.yudao.adminserver.modules.bpm.service.definition;
import cn.hutool.core.util.RandomUtil;
import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormPageReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmFormMapper;
import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmFormFieldRespDTO;
import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmFormServiceImpl;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.FORM_NOT_EXISTS;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
@ -38,7 +50,10 @@ public class BpmFormServiceTest extends BaseDbUnitTest {
@Test
public void testCreateForm_success() {
// 准备参数
BpmFormCreateReqVO reqVO = randomPojo(BpmFormCreateReqVO.class);
BpmFormCreateReqVO reqVO = randomPojo(BpmFormCreateReqVO.class, o -> {
o.setConf("{}");
o.setFields(randomFields());
});
// 调用
Long formId = formService.createForm(reqVO);
@ -52,11 +67,16 @@ public class BpmFormServiceTest extends BaseDbUnitTest {
@Test
public void testUpdateForm_success() {
// mock 数据
BpmFormDO dbForm = randomPojo(BpmFormDO.class);
BpmFormDO dbForm = randomPojo(BpmFormDO.class, o -> {
o.setConf("{}");
o.setFields(randomFields());
});
formMapper.insert(dbForm);// @Sql: 先插入出一条存在的数据
// 准备参数
BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> {
o.setId(dbForm.getId()); // 设置更新的 ID
o.setConf("{'yudao': 'yuanma'}");
o.setFields(randomFields());
});
// 调用
@ -69,7 +89,10 @@ public class BpmFormServiceTest extends BaseDbUnitTest {
@Test
public void testUpdateForm_notExists() {
// 准备参数
BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class);
BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> {
o.setConf("{'yudao': 'yuanma'}");
o.setFields(randomFields());
});
// 调用, 并断言异常
assertServiceException(() -> formService.updateForm(reqVO), FORM_NOT_EXISTS);
@ -119,4 +142,11 @@ public class BpmFormServiceTest extends BaseDbUnitTest {
assertPojoEquals(dbForm, pageResult.getList().get(0));
}
private List<String> randomFields() {
int size = RandomUtil.randomInt(1, 3);
return Stream.iterate(0, i -> i).limit(size)
.map(i -> JsonUtils.toJsonString(randomPojo(BpmFormFieldRespDTO.class)))
.collect(Collectors.toList());
}
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.adminserver.modules.bpm.service.definition;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO;
@ -7,7 +8,9 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.B
import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper;
import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmUserGroupServiceImpl;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
@ -98,27 +101,27 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest {
assertServiceException(() -> userGroupService.deleteUserGroup(id), USER_GROUP_NOT_EXISTS);
}
@Test // TODO 请修改 null 为需要的值
@Test
public void testGetUserGroupPage() {
// mock 数据
BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class, o -> { // 等会查询到
o.setName(null);
o.setStatus(null);
o.setCreateTime(null);
o.setName("芋道源码");
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setCreateTime(DateUtils.buildTime(2021, 11, 11));
});
userGroupMapper.insert(dbUserGroup);
// 测试 name 不匹配
userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setName(null)));
userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setName("芋道")));
// 测试 status 不匹配
userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setStatus(null)));
userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
// 测试 createTime 不匹配
userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setCreateTime(null)));
userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setCreateTime(DateUtils.buildTime(2021, 12, 12))));
// 准备参数
BpmUserGroupPageReqVO reqVO = new BpmUserGroupPageReqVO();
reqVO.setName(null);
reqVO.setStatus(null);
reqVO.setBeginCreateTime(null);
reqVO.setEndCreateTime(null);
reqVO.setName("源码");
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
reqVO.setBeginCreateTime(DateUtils.buildTime(2021, 11, 10));
reqVO.setEndCreateTime(DateUtils.buildTime(2021, 11, 12));
// 调用
PageResult<BpmUserGroupDO> pageResult = userGroupService.getUserGroupPage(reqVO);

View File

@ -172,7 +172,6 @@ class SysDeptServiceTest extends BaseDbUnitTest {
});
// 调用, 并断言异常
assertServiceException(() -> deptService.updateDept(reqVO), DEPT_NAME_DUPLICATE);
}
@Test

View File

@ -28,7 +28,7 @@ import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeCons
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.verify;
@Import(SysMenuServiceImpl.class)
@ -146,12 +146,12 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
SysMenuDO sonMenuDO = initParentAndSonMenuDO();
Long sonId = sonMenuDO.getId();
//调用
// 调用
sysMenuService.deleteMenu(sonId);
//断言
// 断言
SysMenuDO menuDO = menuMapper.selectById(sonId);
Assert.isNull(menuDO);
assertNull(menuDO);
verify(sysPermissionService).processMenuDeleted(sonId);
verify(sysMenuProducer).sendMenuRefreshMessage();
}
@ -182,18 +182,18 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
menuMapper.insert(sonMenu);
idMenuMap.put(sonMenu.getId(), sonMenu);
//调用
// 调用
List<SysMenuDO> menuDOS = sysMenuService.getMenus();
//断言
Assert.isTrue(menuDOS.size() == idMenuMap.size());
// 断言
assertEquals(menuDOS.size(), idMenuMap.size());
menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
}
@Test
public void testGetMenusReqVo_success() {
Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
//用于验证可以模糊搜索名称包含"name"状态为1的menu
// 用于验证可以模糊搜索名称包含"name"状态为1的menu
SysMenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1);
menuMapper.insert(menu);
idMenuMap.put(menu.getId(), menu);
@ -206,32 +206,32 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
menuMapper.insert(menu);
idMenuMap.put(menu.getId(), menu);
//以下是不符合搜索条件的的menu
// 以下是不符合搜索条件的的menu
menu = createMenuDO(MenuTypeEnum.MENU, "xxxxxx", 0L, 1);
menuMapper.insert(menu);
menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 2);
menuMapper.insert(menu);
//调用
// 调用
SysMenuListReqVO reqVO = new SysMenuListReqVO();
reqVO.setStatus(1);
reqVO.setName("name");
List<SysMenuDO> menuDOS = sysMenuService.getMenus(reqVO);
//断言
Assert.isTrue(menuDOS.size() == idMenuMap.size());
// 断言
assertEquals(menuDOS.size(), idMenuMap.size());
menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
}
@Test
public void testListMenusFromCache_success() throws Exception {
Map<Long, SysMenuDO> mockCacheMap = new HashMap<>();
//获取代理对象
// 获取代理对象
SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService);
BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);
Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
//用于验证搜索类型为MENU,状态为1的menu
// 用于验证搜索类型为MENU,状态为1的menu
SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);
mockCacheMap.put(menuDO.getId(), menuDO);
idMenuMap.put(menuDO.getId(), menuDO);
@ -240,7 +240,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
mockCacheMap.put(menuDO.getId(), menuDO);
idMenuMap.put(menuDO.getId(), menuDO);
//以下是不符合搜索条件的menu
// 以下是不符合搜索条件的menu
menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);
mockCacheMap.put(menuDO.getId(), menuDO);
menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);
@ -248,24 +248,24 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(MenuTypeEnum.MENU.getType()),
Collections.singletonList(CommonStatusEnum.DISABLE.getStatus()));
Assert.isTrue(menuDOS.size() == idMenuMap.size());
assertEquals(menuDOS.size(), idMenuMap.size());
menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
}
@Test
public void testListMenusFromCache2_success() throws Exception {
Map<Long, SysMenuDO> mockCacheMap = new HashMap<>();
//获取代理对象
// 获取代理对象
SysMenuServiceImpl target = (SysMenuServiceImpl) SpringAopUtils.getTarget(sysMenuService);
BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);
Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
//验证搜索id为1, 类型为MENU, 状态为1 的menu
// 验证搜索id为1, 类型为MENU, 状态为1 的menu
SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);
mockCacheMap.put(menuDO.getId(), menuDO);
idMenuMap.put(menuDO.getId(), menuDO);
//以下是不符合搜索条件的menu
// 以下是不符合搜索条件的menu
menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1);
mockCacheMap.put(menuDO.getId(), menuDO);
menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);
@ -275,7 +275,7 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(1L),
Collections.singletonList(MenuTypeEnum.MENU.getType()), Collections.singletonList(1));
Assert.isTrue(menuDOS.size() == idMenuMap.size());
assertEquals(menuDOS.size(), idMenuMap.size());
menuDOS.forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu));
}

View File

@ -1,4 +0,0 @@
<configuration>
<!-- 引用 Spring Boot 的 logback 基础配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
</configuration>

View File

@ -0,0 +1,23 @@
<configuration>
<!-- 由于单元测试未开启 Spring Boot 的上下文,所以只能使用 logback.xml 文件 -->
<!-- 引用 Spring Boot 的 logback 基础配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- 格式化输出:%d 表示日期,%X{tid} SkWalking 链路追踪编号,%thread 表示线程名,%-5level级别从左显示 5 个字符宽度,%msg日志消息%n是换行符 -->
<property name="PATTERN_DEFAULT" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%thread] [%tid] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!-- 控制台 Appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">     
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${PATTERN_DEFAULT}</pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>

View File

@ -35,3 +35,4 @@ DELETE FROM pay_refund;
-- bpm 开头的 DB
DELETE FROM "bpm_form";
DELETE FROM "bpm_user_group";

View File

@ -74,7 +74,7 @@ CREATE TABLE IF NOT EXISTS "sys_dept" (
"name" varchar(30) NOT NULL DEFAULT '',
"parent_id" bigint NOT NULL DEFAULT '0',
"sort" int NOT NULL DEFAULT '0',
"leader" varchar(20) DEFAULT NULL,
"leader_user_id" bigint DEFAULT NULL,
"phone" varchar(11) DEFAULT NULL,
"email" varchar(50) DEFAULT NULL,
"status" tinyint NOT NULL,
@ -490,8 +490,9 @@ CREATE TABLE IF NOT EXISTS "pay_merchant"
PRIMARY KEY ("id")
) COMMENT '支付商户信息';
CREATE TABLE IF NOT EXISTS "pay_app"
(
-- bpm 开头的 DB
CREATE TABLE IF NOT EXISTS "pay_app" (
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(64) NOT NULL,
"status" tinyint NOT NULL,
@ -507,8 +508,7 @@ CREATE TABLE IF NOT EXISTS "pay_app"
PRIMARY KEY ("id")
) COMMENT = '支付应用信息';
CREATE TABLE IF NOT EXISTS "pay_channel"
(
CREATE TABLE IF NOT EXISTS "pay_channel" (
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"code" varchar(32) NOT NULL,
"status" tinyint(4) NOT NULL,
@ -525,8 +525,7 @@ CREATE TABLE IF NOT EXISTS "pay_channel"
PRIMARY KEY ("id")
) COMMENT = '支付渠道';
CREATE TABLE IF NOT EXISTS `pay_order`
(
CREATE TABLE IF NOT EXISTS `pay_order` (
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
`merchant_id` bigint(20) NOT NULL,
`app_id` bigint(20) NOT NULL,
@ -559,12 +558,8 @@ CREATE TABLE IF NOT EXISTS `pay_order`
PRIMARY KEY ("id")
) COMMENT = '支付订单';
CREATE TABLE IF NOT EXISTS `pay_refund`
(
CREATE TABLE IF NOT EXISTS `pay_refund` (
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
`req_no` varchar(64) NOT NULL,
`merchant_id` bigint(20) NOT NULL,
`app_id` bigint(20) NOT NULL,
`channel_id` bigint(20) NOT NULL,
@ -597,7 +592,7 @@ CREATE TABLE IF NOT EXISTS `pay_refund`
PRIMARY KEY ("id")
) COMMENT = '退款订单';
-- bpm 开头的 DB
CREATE TABLE IF NOT EXISTS "bpm_form" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
@ -613,3 +608,17 @@ CREATE TABLE IF NOT EXISTS "bpm_form" (
"deleted" bit NOT NULL DEFAULT FALSE,
PRIMARY KEY ("id")
) COMMENT '动态表单';
CREATE TABLE IF NOT EXISTS "bpm_user_group" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(63) NOT NULL,
"description" varchar(255) NOT NULL,
"status" tinyint NOT NULL,
"member_user_ids" varchar(255) NOT 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 '用户组';

View File

@ -70,7 +70,7 @@ public class RandomUtils {
}
public static <T> Set<T> randomSet(Class<T> clazz) {
return Stream.iterate(0, i -> i).limit(RandomUtil.randomInt(0, RANDOM_DATE_MAX))
return Stream.iterate(0, i -> i).limit(RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH))
.map(i -> randomPojo(clazz)).collect(Collectors.toSet());
}

View File

@ -39,6 +39,7 @@
* 总代码行数61594
* 源码代码行数37931
* 注释行数14225
* 单元测试用例数278
### ⭐ New Features