From aaf762e74f6cbda49ed2543c8b76355ae10bba6d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 6 Mar 2021 20:06:43 +0800 Subject: [PATCH] 1. 调整 codegen 的模板 2. 编写 ut 的代码生成器模板 --- src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java | 13 ++++++++----- src/main/resources/application-dev.yaml | 2 +- src/main/resources/application-local.yaml | 2 +- src/main/resources/codegen/java/controller/controller.vm | 10 +++++----- src/main/resources/codegen/java/controller/vo/baseVO.vm | 2 +- src/main/resources/codegen/java/controller/vo/createReqVO.vm | 2 +- src/main/resources/codegen/java/controller/vo/excelVO.vm | 2 +- src/main/resources/codegen/java/controller/vo/exportReqVO.vm | 2 +- src/main/resources/codegen/java/controller/vo/pageReqVO.vm | 2 +- src/main/resources/codegen/java/controller/vo/respVO.vm | 2 +- src/main/resources/codegen/java/controller/vo/updateReqVO.vm | 2 +- src/main/resources/codegen/java/convert/convert.vm | 6 +++--- src/main/resources/codegen/java/dal/do.vm | 2 +- src/main/resources/codegen/java/dal/mapper.vm | 6 +++--- src/main/resources/codegen/java/service/service.vm | 6 +++--- src/main/resources/codegen/java/service/serviceImpl.vm | 14 +++++++------- src/main/resources/codegen/java/test/serviceTest.vm | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceImplTest.java | 227 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java | 4 ++-- src/test/java/cn/iocoder/dashboard/util/RandomUtils.java | 2 +- 22 files changed, 488 insertions(+), 266 deletions(-) create mode 100644 src/main/resources/codegen/java/test/serviceTest.vm delete mode 100644 src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceImplTest.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java create mode 100644 src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java diff --git a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java index 927c977..7ccf260 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java +++ b/src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngine.java @@ -53,9 +53,7 @@ public class ToolCodegenEngine { * value:生成的路径 */ private static final Map TEMPLATES = MapUtil.builder(new LinkedHashMap<>()) // 有序 - // Java - .put(javaTemplatePath("controller/controller"), - javaFilePath("controller/${table.businessName}/${table.className}Controller")) + // Java Main .put(javaTemplatePath("controller/vo/baseVO"), javaFilePath("controller/${table.businessName}/vo/${table.className}BaseVO")) .put(javaTemplatePath("controller/vo/createReqVO"), @@ -70,6 +68,8 @@ public class ToolCodegenEngine { javaFilePath("controller/${table.businessName}/vo/${table.className}ExportReqVO")) .put(javaTemplatePath("controller/vo/excelVO"), javaFilePath("controller/${table.businessName}/vo/${table.className}ExcelVO")) + .put(javaTemplatePath("controller/controller"), + javaFilePath("controller/${table.businessName}/${table.className}Controller")) .put(javaTemplatePath("convert/convert"), javaFilePath("convert/${table.businessName}/${table.className}Convert")) .put(javaTemplatePath("dal/do"), @@ -78,10 +78,13 @@ public class ToolCodegenEngine { javaFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) .put(javaTemplatePath("enums/errorcode"), javaFilePath("enums/${simpleModuleName_upperFirst}ErrorCodeConstants")) - .put(javaTemplatePath("service/service"), - javaFilePath("service/${table.businessName}/${table.className}Service")) .put(javaTemplatePath("service/serviceImpl"), javaFilePath("service/${table.businessName}/impl/${table.className}ServiceImpl")) + .put(javaTemplatePath("service/service"), + javaFilePath("service/${table.businessName}/${table.className}Service")) + // Java Test + .put(javaTemplatePath("test/serviceTest"), + javaFilePath("service/${table.businessName}/${table.className}ServiceTest")) // Vue .put(vueTemplatePath("views/index.vue"), vueFilePath("views/${table.moduleName}/${classNameVar}/index.vue")) diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 6e4dfb3..dbf2ad5 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -154,7 +154,7 @@ yudao: file: base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ codegen: - base-package: ${yudao.info.base-package}.modules + base-package: ${yudao.info.base-package} db-schemas: ${spring.datasource.name} xss: enable: false diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml index 5019cd1..537156c 100644 --- a/src/main/resources/application-local.yaml +++ b/src/main/resources/application-local.yaml @@ -154,7 +154,7 @@ yudao: file: base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ codegen: - base-package: ${yudao.info.base-package}.modules + base-package: ${yudao.info.base-package} db-schemas: ${spring.datasource.name} xss: enable: false diff --git a/src/main/resources/codegen/java/controller/controller.vm b/src/main/resources/codegen/java/controller/controller.vm index 9cb4169..664d7c5 100644 --- a/src/main/resources/codegen/java/controller/controller.vm +++ b/src/main/resources/codegen/java/controller/controller.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -22,10 +22,10 @@ import ${ExcelUtilsClassName}; import ${OperateLogClassName}; import static ${OperateTypeEnumClassName}.*; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -import ${basePackage}.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; -import ${basePackage}.${table.moduleName}.service.${table.businessName}.${table.className}Service; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.modules.${table.moduleName}.service.${table.businessName}.${table.className}Service; @Api(tags = "${table.classComment}") @RestController diff --git a/src/main/resources/codegen/java/controller/vo/baseVO.vm b/src/main/resources/codegen/java/controller/vo/baseVO.vm index 8e85865..705869a 100644 --- a/src/main/resources/codegen/java/controller/vo/baseVO.vm +++ b/src/main/resources/codegen/java/controller/vo/baseVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/createReqVO.vm b/src/main/resources/codegen/java/controller/vo/createReqVO.vm index 3ef3618..cfb2882 100644 --- a/src/main/resources/codegen/java/controller/vo/createReqVO.vm +++ b/src/main/resources/codegen/java/controller/vo/createReqVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/excelVO.vm b/src/main/resources/codegen/java/controller/vo/excelVO.vm index 8eb0350..29f7771 100644 --- a/src/main/resources/codegen/java/controller/vo/excelVO.vm +++ b/src/main/resources/codegen/java/controller/vo/excelVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/exportReqVO.vm b/src/main/resources/codegen/java/controller/vo/exportReqVO.vm index 6a5dbc0..cd0e340 100644 --- a/src/main/resources/codegen/java/controller/vo/exportReqVO.vm +++ b/src/main/resources/codegen/java/controller/vo/exportReqVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/pageReqVO.vm b/src/main/resources/codegen/java/controller/vo/pageReqVO.vm index 7163074..0ac69e9 100644 --- a/src/main/resources/codegen/java/controller/vo/pageReqVO.vm +++ b/src/main/resources/codegen/java/controller/vo/pageReqVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/respVO.vm b/src/main/resources/codegen/java/controller/vo/respVO.vm index 9176c07..a100dd1 100644 --- a/src/main/resources/codegen/java/controller/vo/respVO.vm +++ b/src/main/resources/codegen/java/controller/vo/respVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/controller/vo/updateReqVO.vm b/src/main/resources/codegen/java/controller/vo/updateReqVO.vm index 173b8db..a05ae8d 100644 --- a/src/main/resources/codegen/java/controller/vo/updateReqVO.vm +++ b/src/main/resources/codegen/java/controller/vo/updateReqVO.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo; +package ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/convert/convert.vm b/src/main/resources/codegen/java/convert/convert.vm index 0ec1031..4302bd2 100644 --- a/src/main/resources/codegen/java/convert/convert.vm +++ b/src/main/resources/codegen/java/convert/convert.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.convert.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.convert.${table.businessName}; import java.util.*; @@ -6,8 +6,8 @@ import ${PageResultClassName}; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; /** * ${table.classComment} Convert diff --git a/src/main/resources/codegen/java/dal/do.vm b/src/main/resources/codegen/java/dal/do.vm index b70d01d..8f10fd5 100644 --- a/src/main/resources/codegen/java/dal/do.vm +++ b/src/main/resources/codegen/java/dal/do.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}; import lombok.*; import java.util.*; diff --git a/src/main/resources/codegen/java/dal/mapper.vm b/src/main/resources/codegen/java/dal/mapper.vm index cc1c2ae..2452ca8 100644 --- a/src/main/resources/codegen/java/dal/mapper.vm +++ b/src/main/resources/codegen/java/dal/mapper.vm @@ -1,13 +1,13 @@ -package ${basePackage}.${table.moduleName}.dal.mysql.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.dal.mysql.${table.businessName}; import java.util.*; import ${PageResultClassName}; import ${QueryWrapperClassName}; import ${BaseMapperClassName}; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; import org.apache.ibatis.annotations.Mapper; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; ## 字段模板 #macro(listCondition) diff --git a/src/main/resources/codegen/java/service/service.vm b/src/main/resources/codegen/java/service/service.vm index 31cba1c..0449931 100644 --- a/src/main/resources/codegen/java/service/service.vm +++ b/src/main/resources/codegen/java/service/service.vm @@ -1,9 +1,9 @@ -package ${basePackage}.${table.moduleName}.service.${table.businessName}; +package ${basePackage}.modules.${table.moduleName}.service.${table.businessName}; import java.util.*; import javax.validation.*; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; import ${PageResultClassName}; /** diff --git a/src/main/resources/codegen/java/service/serviceImpl.vm b/src/main/resources/codegen/java/service/serviceImpl.vm index 7bd61c8..0889f0c 100644 --- a/src/main/resources/codegen/java/service/serviceImpl.vm +++ b/src/main/resources/codegen/java/service/serviceImpl.vm @@ -1,4 +1,4 @@ -package ${basePackage}.${table.moduleName}.service.${table.businessName}.impl; +package ${basePackage}.modules.${table.moduleName}.service.${table.businessName}.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -6,17 +6,17 @@ import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; import java.util.*; -import ${basePackage}.${table.moduleName}.controller.${table.businessName}.vo.*; -import ${basePackage}.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; import ${PageResultClassName}; -import ${basePackage}.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; -import ${basePackage}.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; -import ${basePackage}.${table.moduleName}.service.${table.businessName}.${table.className}Service; +import ${basePackage}.modules.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.modules.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; +import ${basePackage}.modules.${table.moduleName}.service.${table.businessName}.${table.className}Service; import ${ServiceExceptionUtilClassName}; -import static ${basePackage}.${table.moduleName}.enums.${simpleModuleName_upperFirst}ErrorCodeConstants.*; +import static ${basePackage}.modules.${table.moduleName}.enums.${simpleModuleName_upperFirst}ErrorCodeConstants.*; /** * ${table.classComment} Service 实现类 diff --git a/src/main/resources/codegen/java/test/serviceTest.vm b/src/main/resources/codegen/java/test/serviceTest.vm new file mode 100644 index 0000000..8713db4 --- /dev/null +++ b/src/main/resources/codegen/java/test/serviceTest.vm @@ -0,0 +1,111 @@ +package ${basePackage}.modules.${table.moduleName}.service.${table.businessName}; + +import ${basePackage}.BaseSpringBootUnitTest; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import ${basePackage}.modules.${table.moduleName}.service.${table.businessName}.impl.${table.className}ServiceImpl; +import ${basePackage}.modules.${table.moduleName}.controller.${table.businessName}.vo.*; +import ${basePackage}.modules.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.modules.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; + +import javax.annotation.Resource; + +import static cn.hutool.core.util.RandomUtil.*; +import static ${basePackage}.modules.${table.moduleName}.enums.${simpleModuleName_upperFirst}ErrorCodeConstants.*; +import static cn.iocoder.dashboard.util.AssertUtils.*; +import static cn.iocoder.dashboard.util.RandomUtils.*; +import static cn.iocoder.dashboard.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link ${table.className}ServiceImpl} 的单元测试类 +* +* @author ${table.author} +*/ +public class ${table.className}ServiceTest extends BaseSpringBootUnitTest { + + @Resource + private ${table.className}ServiceImpl ${classNameVar}Service; + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Test + public void testCreate${simpleClassName}_success() { + // 准备参数 + ${table.className}CreateReqVO reqVO = randomPojo(${table.className}CreateReqVO.class); + + // 调用 + Long ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(reqVO); + // 断言 + assertNotNull(${classNameVar}Id); + // 校验记录的属性是否正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(${classNameVar}Id); + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${table.className}UpdateReqVO reqVO = randomPojo(${table.className}UpdateReqVO.class, o -> { + o.setId(db${simpleClassName}.getId()); // 设置更新的 ID + }); + + // 调用 + ${classNameVar}Service.update${simpleClassName}(reqVO); + // 校验是否更新正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_notExists() { + // 准备参数 + ${table.className}UpdateReqVO reqVO = randomPojo(${table.className}UpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.update${simpleClassName}(reqVO), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + public void testDelete${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = db${simpleClassName}.getId(); + + // 调用 + ${classNameVar}Service.delete${simpleClassName}(id); + // 校验数据不存在了 + assertNull(configMapper.selectById(id)); + } + + @Test + public void testDelete${simpleClassName}_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + public void testGet${simpleClassName}Page() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> {); // 等会查询到 + + }); + ${classNameVar}Mapper.insert(db${simpleClassName}); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceImplTest.java deleted file mode 100644 index d56aabf..0000000 --- a/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceImplTest.java +++ /dev/null @@ -1,227 +0,0 @@ -package cn.iocoder.dashboard.modules.infra.service.config; - -import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.dashboard.BaseSpringBootUnitTest; -import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigExportReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigPageReqVO; -import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigMapper; -import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum; -import cn.iocoder.dashboard.modules.infra.mq.producer.config.InfConfigProducer; -import cn.iocoder.dashboard.modules.infra.service.config.impl.InfConfigServiceImpl; -import cn.iocoder.dashboard.util.object.ObjectUtils; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; - -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.infra.enums.InfErrorCodeConstants.*; -import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; -import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; -import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -public class InfConfigServiceImplTest extends BaseSpringBootUnitTest { - - @Resource - private InfConfigServiceImpl configService; - - @Resource - private InfConfigMapper configMapper; - - @MockBean - private InfConfigProducer configProducer; - - @Test - public void testGetConfigPage() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 - o.setName("芋艿"); - o.setKey("yunai"); - o.setType(InfConfigTypeEnum.SYSTEM.getType()); - o.setCreateTime(buildTime(2021, 2, 1)); - }); - configMapper.insert(dbConfig); - // 测试 name 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); - // 测试 key 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); - // 测试 type 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); - // 测试 createTime 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - InfConfigPageReqVO reqVO = new InfConfigPageReqVO(); - reqVO.setName("艿"); - reqVO.setKey("nai"); - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); - reqVO.setBeginTime(buildTime(2021, 1, 15)); - reqVO.setEndTime(buildTime(2021, 2, 15)); - - // 调用 - PageResult pageResult = configService.getConfigPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbConfig, pageResult.getList().get(0)); - } - - @Test - public void testGetConfigList() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 - o.setName("芋艿"); - o.setKey("yunai"); - o.setType(InfConfigTypeEnum.SYSTEM.getType()); - o.setCreateTime(buildTime(2021, 2, 1)); - }); - configMapper.insert(dbConfig); - // 测试 name 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); - // 测试 key 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); - // 测试 type 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); - // 测试 createTime 不匹配 - configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); - // 准备参数 - InfConfigExportReqVO reqVO = new InfConfigExportReqVO(); - reqVO.setName("艿"); - reqVO.setKey("nai"); - reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); - reqVO.setBeginTime(buildTime(2021, 1, 15)); - reqVO.setEndTime(buildTime(2021, 2, 15)); - - // 调用 - List list = configService.getConfigList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbConfig, list.get(0)); - } - - @Test - public void testGetConfigByKey() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - String key = dbConfig.getKey(); - - // 调用 - InfConfigDO config = configService.getConfigByKey(key); - // 断言 - assertNotNull(config); - assertPojoEquals(dbConfig, config); - } - - @Test - public void testCreateConfig_success() { - // 准备参数 - InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); - - // 调用 - Long configId = configService.createConfig(reqVO); - // 断言 - assertNotNull(configId); - // 校验记录的属性是否正确 - InfConfigDO config = configMapper.selectById(configId); - assertPojoEquals(reqVO, config); - assertEquals(InfConfigTypeEnum.CUSTOM.getType(), config.getType()); - // 校验调用 - verify(configProducer, times(1)).sendConfigRefreshMessage(); - } - - @Test - public void testCreateConfig_keyDuplicate() { - // 准备参数 - InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); - // mock 数据 - configMapper.insert(randomInfConfigDO(o -> { // @Sql - o.setKey(reqVO.getKey()); // 模拟 key 重复 - })); - - // 调用, 并断言异常 - assertServiceException(() -> configService.createConfig(reqVO), CONFIG_KEY_DUPLICATE); - } - - @Test - public void testUpdateConfig_success() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class, o -> { - o.setId(dbConfig.getId()); // 设置更新的 ID - }); - - // 调用 - configService.updateConfig(reqVO); - // 校验是否更新正确 - InfConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 - assertPojoEquals(reqVO, config); - // 校验调用 - verify(configProducer, times(1)).sendConfigRefreshMessage(); - } - - @Test - public void testUpdateConfig_notExists() { - // 准备参数 - InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> configService.updateConfig(reqVO), CONFIG_NOT_EXISTS); - } - - @Test - public void testDeleteConfig_success() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { - o.setType(InfConfigTypeEnum.CUSTOM.getType()); // 只能删除 CUSTOM 类型 - }); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbConfig.getId(); - - // 调用 - configService.deleteConfig(id); - // 校验数据不存在了 - assertNull(configMapper.selectById(id)); - // 校验调用 - verify(configProducer, times(1)).sendConfigRefreshMessage(); - } - - @Test - public void testDeleteConfig_canNotDeleteSystemType() { - // mock 数据 - InfConfigDO dbConfig = randomInfConfigDO(o -> { - o.setType(InfConfigTypeEnum.SYSTEM.getType()); // SYSTEM 不允许删除 - }); - configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbConfig.getId(); - - // 调用, 并断言异常 - assertServiceException(() -> configService.deleteConfig(id), CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); - } - - // ========== 随机对象 ========== - - @SafeVarargs - @SuppressWarnings("unchecked") - private static InfConfigDO randomInfConfigDO(Consumer... consumers) { - Consumer consumer = (o) -> { - o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 - }; - return randomPojo(InfConfigDO.class, ArrayUtil.append(new Consumer[]{consumer}, consumers)); - } - -} diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java new file mode 100644 index 0000000..6f95f5a --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java @@ -0,0 +1,238 @@ +package cn.iocoder.dashboard.modules.infra.service.config; + +import cn.hutool.core.util.ArrayUtil; +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; +import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigExportReqVO; +import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigPageReqVO; +import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; +import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigMapper; +import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum; +import cn.iocoder.dashboard.modules.infra.mq.producer.config.InfConfigProducer; +import cn.iocoder.dashboard.modules.infra.service.config.impl.InfConfigServiceImpl; +import cn.iocoder.dashboard.util.object.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.*; +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.*; +import static cn.iocoder.dashboard.util.AssertUtils.*; +import static cn.iocoder.dashboard.util.RandomUtils.*; +import static cn.iocoder.dashboard.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link InfConfigServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +public class InfConfigServiceTest extends BaseSpringBootUnitTest { + + @Resource + private InfConfigServiceImpl configService; + + @Resource + private InfConfigMapper configMapper; + @MockBean + private InfConfigProducer configProducer; + + @Test + public void testGetConfigPage() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 + o.setName("芋艿"); + o.setKey("yunai"); + o.setType(InfConfigTypeEnum.SYSTEM.getType()); + o.setCreateTime(buildTime(2021, 2, 1)); + }); + configMapper.insert(dbConfig); + // 测试 name 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); + // 测试 key 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); + // 测试 type 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); + // 测试 createTime 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + InfConfigPageReqVO reqVO = new InfConfigPageReqVO(); + reqVO.setName("艿"); + reqVO.setKey("nai"); + reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); + reqVO.setBeginTime(buildTime(2021, 1, 15)); + reqVO.setEndTime(buildTime(2021, 2, 15)); + + // 调用 + PageResult pageResult = configService.getConfigPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbConfig, pageResult.getList().get(0)); + } + + @Test + public void testGetConfigList() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { // 等会查询到 + o.setName("芋艿"); + o.setKey("yunai"); + o.setType(InfConfigTypeEnum.SYSTEM.getType()); + o.setCreateTime(buildTime(2021, 2, 1)); + }); + configMapper.insert(dbConfig); + // 测试 name 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setName("土豆"))); + // 测试 key 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setKey("tudou"))); + // 测试 type 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setType(InfConfigTypeEnum.CUSTOM.getType()))); + // 测试 createTime 不匹配 + configMapper.insert(ObjectUtils.clone(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + InfConfigExportReqVO reqVO = new InfConfigExportReqVO(); + reqVO.setName("艿"); + reqVO.setKey("nai"); + reqVO.setType(InfConfigTypeEnum.SYSTEM.getType()); + reqVO.setBeginTime(buildTime(2021, 1, 15)); + reqVO.setEndTime(buildTime(2021, 2, 15)); + + // 调用 + List list = configService.getConfigList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbConfig, list.get(0)); + } + + @Test + public void testGetConfigByKey() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + String key = dbConfig.getKey(); + + // 调用 + InfConfigDO config = configService.getConfigByKey(key); + // 断言 + assertNotNull(config); + assertPojoEquals(dbConfig, config); + } + + @Test + public void testCreateConfig_success() { + // 准备参数 + InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); + + // 调用 + Long configId = configService.createConfig(reqVO); + // 断言 + assertNotNull(configId); + // 校验记录的属性是否正确 + InfConfigDO config = configMapper.selectById(configId); + assertPojoEquals(reqVO, config); + assertEquals(InfConfigTypeEnum.CUSTOM.getType(), config.getType()); + // 校验调用 + verify(configProducer, times(1)).sendConfigRefreshMessage(); + } + + @Test + public void testCreateConfig_keyDuplicate() { + // 准备参数 + InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); + // mock 数据 + configMapper.insert(randomInfConfigDO(o -> { // @Sql + o.setKey(reqVO.getKey()); // 模拟 key 重复 + })); + + // 调用, 并断言异常 + assertServiceException(() -> configService.createConfig(reqVO), CONFIG_KEY_DUPLICATE); + } + + @Test + public void testUpdateConfig_success() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class, o -> { + o.setId(dbConfig.getId()); // 设置更新的 ID + }); + + // 调用 + configService.updateConfig(reqVO); + // 校验是否更新正确 + InfConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, config); + // 校验调用 + verify(configProducer, times(1)).sendConfigRefreshMessage(); + } + + @Test + public void testUpdateConfig_notExists() { + // 准备参数 + InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> configService.updateConfig(reqVO), CONFIG_NOT_EXISTS); + } + + @Test + public void testDeleteConfig_success() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { + o.setType(InfConfigTypeEnum.CUSTOM.getType()); // 只能删除 CUSTOM 类型 + }); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbConfig.getId(); + + // 调用 + configService.deleteConfig(id); + // 校验数据不存在了 + assertNull(configMapper.selectById(id)); + // 校验调用 + verify(configProducer, times(1)).sendConfigRefreshMessage(); + } + + @Test + public void testDeleteConfig_canNotDeleteSystemType() { + // mock 数据 + InfConfigDO dbConfig = randomInfConfigDO(o -> { + o.setType(InfConfigTypeEnum.SYSTEM.getType()); // SYSTEM 不允许删除 + }); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbConfig.getId(); + + // 调用, 并断言异常 + assertServiceException(() -> configService.deleteConfig(id), CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + } + + @Test + public void testDeleteConfig_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> configService.deleteConfig(id), CONFIG_NOT_EXISTS); + } + + // ========== 随机对象 ========== + + @SafeVarargs + @SuppressWarnings("unchecked") + private static InfConfigDO randomInfConfigDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围 + }; + return randomPojo(InfConfigDO.class, ArrayUtil.append(new Consumer[]{consumer}, consumers)); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java b/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java new file mode 100644 index 0000000..d5fdf5c --- /dev/null +++ b/src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfConfigServiceTest.java @@ -0,0 +1,97 @@ +package cn.iocoder.dashboard.modules.infra.service.job; + +import cn.iocoder.dashboard.BaseSpringBootUnitTest; +import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; +import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigUpdateReqVO; +import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; +import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigMapper; +import cn.iocoder.dashboard.modules.infra.service.config.impl.InfConfigServiceImpl; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; + +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.CONFIG_NOT_EXISTS; +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.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** +* {@link InfConfigServiceImpl} 的单元测试类 +* +* @author 芋艿 +*/ +public class InfConfigServiceTest extends BaseSpringBootUnitTest { + + @Resource + private InfConfigServiceImpl configService; + + @Resource + private InfConfigMapper configMapper; + + @Test + public void testCreateConfig_success() { + // 准备参数 + InfConfigCreateReqVO reqVO = randomPojo(InfConfigCreateReqVO.class); + + // 调用 + Long configId = configService.createConfig(reqVO); + // 断言 + assertNotNull(configId); + // 校验记录的属性是否正确 + InfConfigDO config = configMapper.selectById(configId); + assertPojoEquals(reqVO, config); + } + + @Test + public void testUpdateConfig_success() { + // mock 数据 + InfConfigDO dbConfig = randomPojo(InfConfigDO.class); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class, o -> { + o.setId(dbConfig.getId()); // 设置更新的 ID + }); + + // 调用 + configService.updateConfig(reqVO); + // 校验是否更新正确 + InfConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, config); + } + + @Test + public void testUpdateConfig_notExists() { + // 准备参数 + InfConfigUpdateReqVO reqVO = randomPojo(InfConfigUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> configService.updateConfig(reqVO), CONFIG_NOT_EXISTS); + } + + @Test + public void testDeleteConfig_success() { + // mock 数据 + InfConfigDO dbConfig = randomPojo(InfConfigDO.class); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbConfig.getId(); + + // 调用 + configService.deleteConfig(id); + // 校验数据不存在了 + assertNull(configMapper.selectById(id)); + } + + @Test + public void testDeleteConfig_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> configService.deleteConfig(id), CONFIG_NOT_EXISTS); + } + +} diff --git a/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java b/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java index 5e79a0c..5d9ac58 100644 --- a/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java +++ b/src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java @@ -61,7 +61,7 @@ public class SysAuthServiceImplTest extends BaseSpringBootUnitTest { @Test public void testMockLogin_success() { // 准备参数 - Long userId = randomLong(); + Long userId = randomLongId(); // mock 方法 01 SysUserDO user = randomUserDO(o -> o.setId(userId)); when(userService.getUser(eq(userId))).thenReturn(user); @@ -80,7 +80,7 @@ public class SysAuthServiceImplTest extends BaseSpringBootUnitTest { @Test public void testMockLogin_userNotFound() { // 准备参数 - Long userId = randomLong(); + Long userId = randomLongId(); // mock 方法 // 调用, 并断言异常 diff --git a/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java b/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java index 36d5827..5726686 100644 --- a/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java +++ b/src/test/java/cn/iocoder/dashboard/util/RandomUtils.java @@ -46,7 +46,7 @@ public class RandomUtils { return RandomUtil.randomString(RANDOM_STRING_LENGTH); } - public static Long randomLong() { + public static Long randomLongId() { return RandomUtil.randomLong(0, Long.MAX_VALUE); } -- libgit2 0.21.4