job 单元测试

pull/2/head
neilz 2021-03-14 20:59:40 +08:00
parent 0775e85aac
commit ca1132f2df
5 changed files with 439 additions and 38 deletions

View File

@ -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;

View File

@ -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));
}
}

View File

@ -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
* 1schedulerManager.addJob sysUserSessionTimeoutJob
* 2schedulerManager.triggerJob
* 3check 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) {

View File

@ -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";

View File

@ -29,24 +29,44 @@ 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 '任务状态',
"handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字',
"handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数',
"cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式', "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式',
"retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数',
"retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔', "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔',
"monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间', "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间',
"creator" varchar(64) DEFAULT '' COMMENT '创建者', "creator" varchar(64) DEFAULT '' COMMENT '创建者',
"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" (