mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	job 单元测试
This commit is contained in:
		| @@ -13,7 +13,6 @@ import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobMapper; | |||||||
| import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum; | import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum; | ||||||
| import cn.iocoder.dashboard.modules.infra.service.job.InfJobService; | import cn.iocoder.dashboard.modules.infra.service.job.InfJobService; | ||||||
| import org.quartz.SchedulerException; | import org.quartz.SchedulerException; | ||||||
| import org.springframework.boot.test.mock.mockito.MockBean; |  | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
| @@ -38,7 +37,6 @@ public class InfJobServiceImpl implements InfJobService { | |||||||
|     @Resource |     @Resource | ||||||
|     private InfJobMapper jobMapper; |     private InfJobMapper jobMapper; | ||||||
|  |  | ||||||
|     @MockBean |  | ||||||
|     @Resource |     @Resource | ||||||
|     private SchedulerManager schedulerManager; |     private SchedulerManager schedulerManager; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -0,0 +1,173 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.infra.service.job; | ||||||
|  |  | ||||||
|  | import static cn.hutool.core.util.RandomUtil.randomEle; | ||||||
|  | import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; | ||||||
|  | import static cn.iocoder.dashboard.util.RandomUtils.randomLongId; | ||||||
|  | import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; | ||||||
|  | import static cn.iocoder.dashboard.util.RandomUtils.randomString; | ||||||
|  | import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertEquals; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import javax.annotation.Resource; | ||||||
|  |  | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.springframework.context.annotation.Import; | ||||||
|  |  | ||||||
|  | import cn.iocoder.dashboard.BaseDbUnitTest; | ||||||
|  | import cn.iocoder.dashboard.common.pojo.PageResult; | ||||||
|  | import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExportReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogPageReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobLogDO; | ||||||
|  | import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobLogMapper; | ||||||
|  | import cn.iocoder.dashboard.modules.infra.enums.job.InfJobLogStatusEnum; | ||||||
|  | import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobLogServiceImpl; | ||||||
|  | import cn.iocoder.dashboard.util.object.ObjectUtils; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * {@link InfJobLogServiceImpl} 的单元测试 | ||||||
|  |  * | ||||||
|  |  * @author neilz | ||||||
|  |  */ | ||||||
|  | @Import(InfJobLogServiceImpl.class) | ||||||
|  | public class InfJobLogServiceTest extends BaseDbUnitTest { | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private InfJobLogServiceImpl jobLogService; | ||||||
|  |     @Resource | ||||||
|  |     private InfJobLogMapper jobLogMapper; | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testCreateJobLog_success() { | ||||||
|  |         // 准备参数 | ||||||
|  |         InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> { | ||||||
|  |             o.setExecuteIndex(1); | ||||||
|  |         }); | ||||||
|  |         // 调用 | ||||||
|  |         Long jobLogId = jobLogService.createJobLog(reqVO.getJobId(), reqVO.getBeginTime(), reqVO.getHandlerName(), reqVO.getHandlerParam(), reqVO.getExecuteIndex()); | ||||||
|  |         // 断言 | ||||||
|  |         assertNotNull(jobLogId); | ||||||
|  |         // 校验记录的属性是否正确 | ||||||
|  |         InfJobLogDO job = jobLogMapper.selectById(jobLogId); | ||||||
|  |         assertEquals(InfJobLogStatusEnum.RUNNING.getStatus(), job.getStatus()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testUpdateJobLogResultAsync_success() { | ||||||
|  |         // 准备参数 | ||||||
|  |         InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> { | ||||||
|  |             o.setExecuteIndex(1); | ||||||
|  |         }); | ||||||
|  |         InfJobLogDO log = InfJobLogDO.builder().jobId(reqVO.getJobId()).handlerName(reqVO.getHandlerName()).handlerParam(reqVO.getHandlerParam()).executeIndex(reqVO.getExecuteIndex()) | ||||||
|  |                 .beginTime(reqVO.getBeginTime()).status(InfJobLogStatusEnum.RUNNING.getStatus()).build(); | ||||||
|  |         jobLogMapper.insert(log); | ||||||
|  |         // 调用 | ||||||
|  |         jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), true,reqVO.getResult()); | ||||||
|  |         // 校验记录的属性是否正确 | ||||||
|  |         InfJobLogDO job = jobLogMapper.selectById(log.getId()); | ||||||
|  |         assertEquals(InfJobLogStatusEnum.SUCCESS.getStatus(), job.getStatus()); | ||||||
|  |  | ||||||
|  |         // 调用 | ||||||
|  |         jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), false,reqVO.getResult()); | ||||||
|  |         // 校验记录的属性是否正确 | ||||||
|  |         InfJobLogDO job2 = jobLogMapper.selectById(log.getId()); | ||||||
|  |         assertEquals(InfJobLogStatusEnum.FAILURE.getStatus(), job2.getStatus()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testGetJobLogListByIds_success() { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { | ||||||
|  |             o.setExecuteIndex(1); | ||||||
|  |             o.setStatus(randomEle(InfJobLogStatusEnum.values()).getStatus()); // 保证 status 的范围 | ||||||
|  |         }); | ||||||
|  |         InfJobLogDO cloneJobLog = ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString())); | ||||||
|  |         jobLogMapper.insert(dbJobLog); | ||||||
|  |         // 测试 handlerName 不匹配 | ||||||
|  |         jobLogMapper.insert(cloneJobLog); | ||||||
|  |         // 准备参数 | ||||||
|  |         ArrayList ids = new ArrayList<>(); | ||||||
|  |         ids.add(dbJobLog.getId()); | ||||||
|  |         ids.add(cloneJobLog.getId()); | ||||||
|  |         // 调用 | ||||||
|  |         List<InfJobLogDO> list = jobLogService.getJobLogList(ids); | ||||||
|  |         // 断言 | ||||||
|  |         assertEquals(2, list.size()); | ||||||
|  |         assertPojoEquals(dbJobLog, list.get(0)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testGetJobPage_success() { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { | ||||||
|  |             o.setExecuteIndex(1); | ||||||
|  |             o.setHandlerName("handlerName 单元测试"); | ||||||
|  |             o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); | ||||||
|  |             o.setBeginTime(buildTime(2021, 1, 8)); | ||||||
|  |             o.setEndTime(buildTime(2021, 1, 8)); | ||||||
|  |         }); | ||||||
|  |         jobLogMapper.insert(dbJobLog); | ||||||
|  |         // 测试 jobId 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId()))); | ||||||
|  |         // 测试 handlerName 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString()))); | ||||||
|  |         // 测试 beginTime 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7)))); | ||||||
|  |         // 测试 endTime 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); | ||||||
|  |         // 测试 status 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus()))); | ||||||
|  |         // 准备参数 | ||||||
|  |         InfJobLogPageReqVO reqVo = new InfJobLogPageReqVO(); | ||||||
|  |         reqVo.setJobId(dbJobLog.getJobId()); | ||||||
|  |         reqVo.setHandlerName("单元"); | ||||||
|  |         reqVo.setBeginTime(dbJobLog.getBeginTime()); | ||||||
|  |         reqVo.setEndTime(dbJobLog.getEndTime()); | ||||||
|  |         reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); | ||||||
|  |         // 调用 | ||||||
|  |         PageResult<InfJobLogDO> pageResult = jobLogService.getJobLogPage(reqVo); | ||||||
|  |         // 断言 | ||||||
|  |         assertEquals(1, pageResult.getTotal()); | ||||||
|  |         assertEquals(1, pageResult.getList().size()); | ||||||
|  |         assertPojoEquals(dbJobLog, pageResult.getList().get(0)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testGetJobListForExport_success() { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> { | ||||||
|  |             o.setExecuteIndex(1); | ||||||
|  |             o.setHandlerName("handlerName 单元测试"); | ||||||
|  |             o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); | ||||||
|  |             o.setBeginTime(buildTime(2021, 1, 8)); | ||||||
|  |             o.setEndTime(buildTime(2021, 1, 8)); | ||||||
|  |         }); | ||||||
|  |         jobLogMapper.insert(dbJobLog); | ||||||
|  |         // 测试 jobId 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId()))); | ||||||
|  |         // 测试 handlerName 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString()))); | ||||||
|  |         // 测试 beginTime 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7)))); | ||||||
|  |         // 测试 endTime 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); | ||||||
|  |         // 测试 status 不匹配 | ||||||
|  |         jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus()))); | ||||||
|  |         // 准备参数 | ||||||
|  |         InfJobLogExportReqVO reqVo = new InfJobLogExportReqVO(); | ||||||
|  |         reqVo.setJobId(dbJobLog.getJobId()); | ||||||
|  |         reqVo.setHandlerName("单元"); | ||||||
|  |         reqVo.setBeginTime(dbJobLog.getBeginTime()); | ||||||
|  |         reqVo.setEndTime(dbJobLog.getEndTime()); | ||||||
|  |         reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus()); | ||||||
|  |         // 调用 | ||||||
|  |         List<InfJobLogDO> list = jobLogService.getJobLogList(reqVo); | ||||||
|  |         // 断言 | ||||||
|  |         assertEquals(1, list.size()); | ||||||
|  |         assertPojoEquals(dbJobLog, list.get(0)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -1,25 +1,43 @@ | |||||||
| package cn.iocoder.dashboard.modules.infra.service.job; | package cn.iocoder.dashboard.modules.infra.service.job; | ||||||
|  |  | ||||||
|  | import static cn.hutool.core.util.RandomUtil.randomEle; | ||||||
|  | import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_EQUALS; | ||||||
|  | import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_INVALID; | ||||||
|  | import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CRON_EXPRESSION_VALID; | ||||||
|  | import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_HANDLER_EXISTS; | ||||||
|  | import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_NOT_EXISTS; | ||||||
|  | import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_UPDATE_ONLY_NORMAL_STATUS; | ||||||
| import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; | 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.RandomUtils.randomPojo; | ||||||
|  | import static cn.iocoder.dashboard.util.RandomUtils.randomString; | ||||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | import static org.junit.jupiter.api.Assertions.assertEquals; | ||||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||||
| import static org.mockito.Mockito.times; | import static org.junit.jupiter.api.Assertions.assertNull; | ||||||
| import static org.mockito.Mockito.verify; |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||||
|  |  | ||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
| import org.quartz.SchedulerException; | import org.quartz.SchedulerException; | ||||||
|  | import org.springframework.boot.test.mock.mockito.MockBean; | ||||||
| import org.springframework.context.annotation.Import; | import org.springframework.context.annotation.Import; | ||||||
|  |  | ||||||
| import cn.iocoder.dashboard.BaseDbUnitTest; | import cn.iocoder.dashboard.BaseDbUnitTest; | ||||||
|  | import cn.iocoder.dashboard.common.pojo.PageResult; | ||||||
| import cn.iocoder.dashboard.framework.quartz.core.scheduler.SchedulerManager; | import cn.iocoder.dashboard.framework.quartz.core.scheduler.SchedulerManager; | ||||||
| import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobCreateReqVO; | import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobCreateReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobExportReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobPageReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobUpdateReqVO; | ||||||
| import cn.iocoder.dashboard.modules.infra.convert.job.InfJobConvert; | import cn.iocoder.dashboard.modules.infra.convert.job.InfJobConvert; | ||||||
| import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO; | import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO; | ||||||
| import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobMapper; | import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobMapper; | ||||||
| import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum; | import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum; | ||||||
| import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobServiceImpl; | import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobServiceImpl; | ||||||
|  | import cn.iocoder.dashboard.util.object.ObjectUtils; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * {@link InfJobServiceImpl} 的单元测试 |  * {@link InfJobServiceImpl} 的单元测试 | ||||||
| @@ -28,45 +46,236 @@ import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobServiceImpl; | |||||||
|  */ |  */ | ||||||
| @Import(InfJobServiceImpl.class) | @Import(InfJobServiceImpl.class) | ||||||
| public class InfJobServiceTest extends BaseDbUnitTest { | public class InfJobServiceTest extends BaseDbUnitTest { | ||||||
|     @Resource |  | ||||||
|     private InfJobServiceImpl jobService; |  | ||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
|     private InfJobMapper jobMapper; |     private InfJobServiceImpl jobService; | ||||||
|     @Resource |     @Resource | ||||||
|  |     private InfJobMapper jobMapper; | ||||||
|  |     @MockBean | ||||||
|     private SchedulerManager schedulerManager; |     private SchedulerManager schedulerManager; | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|     public void testCreateJob_success() throws SchedulerException { |     public void testCreateJob_cronExpressionValid() { | ||||||
|         // 准备参数 |         // 准备参数。Cron 表达式为 String 类型,默认随机字符串。 | ||||||
|         InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class); |         InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class); | ||||||
|         reqVO.setCronExpression("0 0/1 * * * ? *"); |         // 调用,并断言异常 | ||||||
|  |         assertServiceException(() -> jobService.createJob(reqVO), JOB_CRON_EXPRESSION_VALID); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testCreateJob_jobHandlerExists() throws SchedulerException { | ||||||
|  |         // 准备参数 指定 Cron 表达式 | ||||||
|  |         InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); | ||||||
|  |         // 调用 | ||||||
|  |         jobService.createJob(reqVO); | ||||||
|  |         // 调用,并断言异常 | ||||||
|  |         assertServiceException(() -> jobService.createJob(reqVO), JOB_HANDLER_EXISTS); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testCreateJob_success() throws SchedulerException { | ||||||
|  |         // 准备参数 指定 Cron 表达式 | ||||||
|  |         InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); | ||||||
|         // 调用 |         // 调用 | ||||||
|         Long jobId = jobService.createJob(reqVO); |         Long jobId = jobService.createJob(reqVO); | ||||||
|  |  | ||||||
|         // 断言 |         // 断言 | ||||||
|         assertNotNull(jobId); |         assertNotNull(jobId); | ||||||
|  |  | ||||||
|         // 校验记录的属性是否正确 |         // 校验记录的属性是否正确 | ||||||
|         InfJobDO job = jobMapper.selectById(jobId); |         InfJobDO job = jobMapper.selectById(jobId); | ||||||
|         assertPojoEquals(reqVO, job); |         assertPojoEquals(reqVO, job); | ||||||
|         assertEquals(InfJobStatusEnum.NORMAL.getStatus(), job.getStatus()); |         assertEquals(InfJobStatusEnum.NORMAL.getStatus(), job.getStatus()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|         // 校验调用 |     @Test | ||||||
|         verify(jobMapper, times(1)).selectByHandlerName(reqVO.getHandlerName()); |     public void testUpdateJob_jobNotExists(){ | ||||||
|  |         // 准备参数 | ||||||
|  |         InfJobUpdateReqVO reqVO = randomPojo(InfJobUpdateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); | ||||||
|  |         // 调用,并断言异常 | ||||||
|  |         assertServiceException(() -> jobService.updateJob(reqVO), JOB_NOT_EXISTS); | ||||||
|  |     } | ||||||
|  |  | ||||||
|         InfJobDO insertJob = InfJobConvert.INSTANCE.convert(reqVO); |     @Test | ||||||
|         insertJob.setStatus(InfJobStatusEnum.INIT.getStatus()); |     public void testUpdateJob_onlyNormalStatus(){ | ||||||
|         fillJobMonitorTimeoutEmpty(insertJob); |         // mock 数据 | ||||||
|         verify(jobMapper, times(1)).insert(insertJob); |         InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); | ||||||
|  |         InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); | ||||||
|  |         job.setStatus(InfJobStatusEnum.INIT.getStatus()); | ||||||
|  |         fillJobMonitorTimeoutEmpty(job); | ||||||
|  |         jobMapper.insert(job); | ||||||
|  |         // 准备参数 | ||||||
|  |         InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> { | ||||||
|  |             o.setId(job.getId()); | ||||||
|  |             o.setName(createReqVO.getName()); | ||||||
|  |             o.setCronExpression(createReqVO.getCronExpression()); | ||||||
|  |         }); | ||||||
|  |         // 调用,并断言异常 | ||||||
|  |         assertServiceException(() -> jobService.updateJob(updateReqVO), JOB_UPDATE_ONLY_NORMAL_STATUS); | ||||||
|  |     } | ||||||
|  |  | ||||||
|         verify(schedulerManager, times(1)).addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), |     @Test | ||||||
|                 job.getRetryCount(), job.getRetryInterval()); |     public void testUpdateJob_success() throws SchedulerException { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); | ||||||
|  |         InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); | ||||||
|  |         job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); | ||||||
|  |         fillJobMonitorTimeoutEmpty(job); | ||||||
|  |         jobMapper.insert(job); | ||||||
|  |         schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), | ||||||
|  |                 createReqVO.getRetryCount(), createReqVO.getRetryInterval()); | ||||||
|  |         // 准备参数 | ||||||
|  |         InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> { | ||||||
|  |             o.setId(job.getId()); | ||||||
|  |             o.setName(createReqVO.getName()); | ||||||
|  |             o.setCronExpression(createReqVO.getCronExpression()); | ||||||
|  |         }); | ||||||
|  |         // 调用 | ||||||
|  |         jobService.updateJob(updateReqVO); | ||||||
|  |         // 校验记录的属性是否正确 | ||||||
|  |         InfJobDO updateJob = jobMapper.selectById(updateReqVO.getId()); | ||||||
|  |         assertPojoEquals(updateReqVO, updateJob); | ||||||
|  |     } | ||||||
|  |  | ||||||
|         InfJobDO updateObj = InfJobDO.builder().id(insertJob.getId()).status(InfJobStatusEnum.NORMAL.getStatus()).build(); |     @Test | ||||||
|         verify(jobMapper, times(1)).updateById(updateObj); |     public void testUpdateJobStatus_changeStatusInvalid() { | ||||||
|  |         // 调用,并断言异常 | ||||||
|  |         assertServiceException(() -> jobService.updateJobStatus(1l, InfJobStatusEnum.INIT.getStatus()), JOB_CHANGE_STATUS_INVALID); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testUpdateJobStatus_changeStatusEquals() { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); | ||||||
|  |         InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); | ||||||
|  |         job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); | ||||||
|  |         fillJobMonitorTimeoutEmpty(job); | ||||||
|  |         jobMapper.insert(job); | ||||||
|  |         // 调用,并断言异常 | ||||||
|  |         assertServiceException(() -> jobService.updateJobStatus(job.getId(), job.getStatus()), JOB_CHANGE_STATUS_EQUALS); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testUpdateJobStatus_success() throws SchedulerException { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); | ||||||
|  |         InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); | ||||||
|  |         job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); | ||||||
|  |         fillJobMonitorTimeoutEmpty(job); | ||||||
|  |         jobMapper.insert(job); | ||||||
|  |         schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), | ||||||
|  |                 createReqVO.getRetryCount(), createReqVO.getRetryInterval()); | ||||||
|  |         // 调用 | ||||||
|  |         jobService.updateJobStatus(job.getId(), InfJobStatusEnum.STOP.getStatus()); | ||||||
|  |         // 校验记录的属性是否正确 | ||||||
|  |         InfJobDO updateJob = jobMapper.selectById(job.getId()); | ||||||
|  |         assertEquals(InfJobStatusEnum.STOP.getStatus(), updateJob.getStatus()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      *  页面"执行一次"按钮功能集成测试发现问题: | ||||||
|  |      *  inf_job 表初始化任务 sysUserSessionTimeoutJob 点击报错,是因为 Job 并没有添加到 Quartz 中; | ||||||
|  |      *  没有走 createJob 中 scheduler.scheduleJob() 这一步,报错任务找不到。 | ||||||
|  |      *  // FINISHED Quartz 相关表新增初始化任务 sysUserSessionTimeoutJob sql | ||||||
|  |      */ | ||||||
|  |     @Test | ||||||
|  |     public void testTriggerJob_success() throws SchedulerException { | ||||||
|  |         /** | ||||||
|  |          * TODO 不知道是否要将 Quartz 相关 SQL 引入来做单元测试 | ||||||
|  |          * 1、schedulerManager.addJob sysUserSessionTimeoutJob | ||||||
|  |          * 2、schedulerManager.triggerJob | ||||||
|  |          * 3、check inf_job_log | ||||||
|  |          */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testDeleteJob_success() throws SchedulerException { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); | ||||||
|  |         InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO); | ||||||
|  |         job.setStatus(InfJobStatusEnum.NORMAL.getStatus()); | ||||||
|  |         fillJobMonitorTimeoutEmpty(job); | ||||||
|  |         jobMapper.insert(job); | ||||||
|  |         schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), | ||||||
|  |                 createReqVO.getRetryCount(), createReqVO.getRetryInterval()); | ||||||
|  |         // 调用 UPDATE inf_job SET deleted=1 WHERE id=? AND deleted=0 | ||||||
|  |         jobService.deleteJob(job.getId()); | ||||||
|  |         // 校验数据不存在了  WHERE id=? AND deleted=0 查询为空正常 | ||||||
|  |         assertNull(jobMapper.selectById(job.getId())); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testGetJobListByIds_success() { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { | ||||||
|  |             o.setStatus(randomEle(InfJobStatusEnum.values()).getStatus()); // 保证 status 的范围 | ||||||
|  |         }); | ||||||
|  |         InfJobDO cloneJob = ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString())); | ||||||
|  |         jobMapper.insert(dbJob); | ||||||
|  |         // 测试 handlerName 不匹配 | ||||||
|  |         jobMapper.insert(cloneJob); | ||||||
|  |         // 准备参数 | ||||||
|  |         ArrayList ids = new ArrayList<>(); | ||||||
|  |         ids.add(dbJob.getId()); | ||||||
|  |         ids.add(cloneJob.getId()); | ||||||
|  |         // 调用 | ||||||
|  |         List<InfJobDO> list = jobService.getJobList(ids); | ||||||
|  |         // 断言 | ||||||
|  |         assertEquals(2, list.size()); | ||||||
|  |         assertPojoEquals(dbJob, list.get(0)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testGetJobPage_success() { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { | ||||||
|  |             o.setName("定时任务测试"); | ||||||
|  |             o.setHandlerName("handlerName 单元测试"); | ||||||
|  |             o.setStatus(InfJobStatusEnum.INIT.getStatus()); | ||||||
|  |         }); | ||||||
|  |         jobMapper.insert(dbJob); | ||||||
|  |         // 测试 name 不匹配 | ||||||
|  |         jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆"))); | ||||||
|  |         // 测试 status 不匹配 | ||||||
|  |         jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus()))); | ||||||
|  |         // 测试 handlerName 不匹配 | ||||||
|  |         jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString()))); | ||||||
|  |         // 准备参数 | ||||||
|  |         InfJobPageReqVO reqVo = new InfJobPageReqVO(); | ||||||
|  |         reqVo.setName("定时"); | ||||||
|  |         reqVo.setStatus(InfJobStatusEnum.INIT.getStatus()); | ||||||
|  |         reqVo.setHandlerName("单元"); | ||||||
|  |         // 调用 | ||||||
|  |         PageResult<InfJobDO> pageResult = jobService.getJobPage(reqVo); | ||||||
|  |         // 断言 | ||||||
|  |         assertEquals(1, pageResult.getTotal()); | ||||||
|  |         assertEquals(1, pageResult.getList().size()); | ||||||
|  |         assertPojoEquals(dbJob, pageResult.getList().get(0)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Test | ||||||
|  |     public void testGetJobListForExport_success() { | ||||||
|  |         // mock 数据 | ||||||
|  |         InfJobDO dbJob = randomPojo(InfJobDO.class, o -> { | ||||||
|  |             o.setName("定时任务测试"); | ||||||
|  |             o.setHandlerName("handlerName 单元测试"); | ||||||
|  |             o.setStatus(InfJobStatusEnum.INIT.getStatus()); | ||||||
|  |         }); | ||||||
|  |         jobMapper.insert(dbJob); | ||||||
|  |         // 测试 name 不匹配 | ||||||
|  |         jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆"))); | ||||||
|  |         // 测试 status 不匹配 | ||||||
|  |         jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus()))); | ||||||
|  |         // 测试 handlerName 不匹配 | ||||||
|  |         jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString()))); | ||||||
|  |         // 准备参数 | ||||||
|  |         InfJobExportReqVO reqVo = new InfJobExportReqVO(); | ||||||
|  |         reqVo.setName("定时"); | ||||||
|  |         reqVo.setStatus(InfJobStatusEnum.INIT.getStatus()); | ||||||
|  |         reqVo.setHandlerName("单元"); | ||||||
|  |         // 调用 | ||||||
|  |         List<InfJobDO> list = jobService.getJobList(reqVo); | ||||||
|  |         // 断言 | ||||||
|  |         assertEquals(1, list.size()); | ||||||
|  |         assertPojoEquals(dbJob, list.get(0)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static void fillJobMonitorTimeoutEmpty(InfJobDO job) { |     private static void fillJobMonitorTimeoutEmpty(InfJobDO job) { | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ | |||||||
| DELETE FROM "inf_config"; | DELETE FROM "inf_config"; | ||||||
| DELETE FROM "inf_file"; | DELETE FROM "inf_file"; | ||||||
| DELETE FROM "inf_job"; | DELETE FROM "inf_job"; | ||||||
|  | DELETE FROM "inf_job_log"; | ||||||
|  |  | ||||||
| -- sys 开头的 DB | -- sys 开头的 DB | ||||||
| DELETE FROM "sys_dept"; | DELETE FROM "sys_dept"; | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ CREATE TABLE IF NOT EXISTS "inf_file" ( | |||||||
|     PRIMARY KEY ("id") |     PRIMARY KEY ("id") | ||||||
| ) COMMENT '文件表'; | ) COMMENT '文件表'; | ||||||
|  |  | ||||||
| CREATE TABLE "inf_job" ( | CREATE TABLE IF NOT EXISTS "inf_job" ( | ||||||
|     "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', |     "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', | ||||||
|     "name" varchar(32) NOT NULL COMMENT '任务名称', |     "name" varchar(32) NOT NULL COMMENT '任务名称', | ||||||
|     "status" tinyint(4) NOT NULL COMMENT '任务状态', |     "status" tinyint(4) NOT NULL COMMENT '任务状态', | ||||||
| @@ -43,10 +43,30 @@ CREATE TABLE "inf_job" ( | |||||||
|     "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', |     "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||||||
|     "updater" varchar(64) DEFAULT '' COMMENT '更新者', |     "updater" varchar(64) DEFAULT '' COMMENT '更新者', | ||||||
|     "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |     "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | ||||||
|    "deleted" bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', |     "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除', | ||||||
|     PRIMARY KEY ("id") |     PRIMARY KEY ("id") | ||||||
| ) COMMENT='定时任务表'; | ) COMMENT='定时任务表'; | ||||||
|  |  | ||||||
|  | DROP TABLE IF EXISTS "inf_job_log"; | ||||||
|  | CREATE TABLE "inf_job_log" ( | ||||||
|  |     "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', | ||||||
|  |     "job_id" bigint(20) NOT NULL COMMENT '任务编号', | ||||||
|  |     "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', | ||||||
|  |     "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', | ||||||
|  |     "execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行', | ||||||
|  |     "begin_time" datetime NOT NULL COMMENT '开始执行时间', | ||||||
|  |     "end_time" datetime DEFAULT NULL COMMENT '结束执行时间', | ||||||
|  |     "duration" int(11) DEFAULT NULL COMMENT '执行时长', | ||||||
|  |     "status" tinyint(4) NOT NULL COMMENT '任务状态', | ||||||
|  |     "result" varchar(4000) DEFAULT '' COMMENT '结果数据', | ||||||
|  |     "creator" varchar(64) DEFAULT '' COMMENT '创建者', | ||||||
|  |     "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||||||
|  |     "updater" varchar(64) DEFAULT '' COMMENT '更新者', | ||||||
|  |     "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | ||||||
|  |     "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除', | ||||||
|  |     PRIMARY KEY ("id") | ||||||
|  | )COMMENT='定时任务日志表'; | ||||||
|  |  | ||||||
| -- sys 开头的 DB | -- sys 开头的 DB | ||||||
|  |  | ||||||
| CREATE TABLE IF NOT EXISTS "sys_dept" ( | CREATE TABLE IF NOT EXISTS "sys_dept" ( | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 neilz
					neilz