diff --git a/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/controller/DklVideoDataControllerTest.java b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/controller/DklVideoDataControllerTest.java new file mode 100644 index 0000000..d2317eb --- /dev/null +++ b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/controller/DklVideoDataControllerTest.java @@ -0,0 +1,224 @@ +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import com.dkl.common.core.domain.AjaxResult; +import com.dkl.common.core.page.TableDataInfo; +import com.dkl.large.controller.DklVideoDataController; +import com.dkl.large.domain.DklVideoData; +import com.dkl.large.service.IDklVideoDataService; + +/** + * DklVideoDataController 单元测试 + * 遵循 JUnit 5 + Mockito 统一风格 + * + * @author Dkl + * @date 2025-06-06 + */ +@ExtendWith(MockitoExtension.class) +class DklVideoDataControllerTest { + + // Mock 业务层服务(Controller 依赖的核心组件) + @Mock + private IDklVideoDataService dklVideoDataService; + + // 注入 Mock 到待测试的 Controller + @InjectMocks + private DklVideoDataController dklVideoDataController; + + // 测试用例数据初始化 + private DklVideoData testVideoData; + private List testVideoDataList; + + /** + * 前置初始化:统一设置测试数据,避免重复代码 + */ + @BeforeEach + void setUp() { + // 初始化单条测试数据 + testVideoData = new DklVideoData(); + testVideoData.setId(1); + testVideoData.setDelFlag("0"); + testVideoData.setCreateTime(new Date()); + testVideoData.setCreateBy("testUser"); + testVideoData.setDeptId(100L); + testVideoData.setUpdateTime(new Date()); + testVideoData.setUpdateBy("testUser"); + + // 初始化列表测试数据 + testVideoDataList = new ArrayList<>(); + testVideoDataList.add(testVideoData); + + // 模拟 Controller 父类的基础方法(BaseController) + // 注:若 BaseController 的 getUsername()/getDeptId()/startPage()/getDataTable() 是私有/受保护方法, + // 需要通过 Mockito spy 或 PowerMock 模拟,此处先 Mock 核心返回值 + doReturn("testUser").when(dklVideoDataController).getUsername(); + doReturn(100L).when(dklVideoDataController).getDeptId(); + } + + // ---------------------- 测试场景 1:查询列表(list 接口) ---------------------- + @Test + void list_ValidParam_ReturnsTableDataInfo() { + // 1. Mock 业务层方法返回值 + when(dklVideoDataService.selectDklVideoDataList(any(DklVideoData.class))).thenReturn(testVideoDataList); + + // 2. 执行 Controller 方法 + TableDataInfo result = dklVideoDataController.list(testVideoData); + + // 3. 断言结果有效性 + assertNotNull(result); + assertNotNull(result.getRows()); + assertEquals(1, result.getRows().size()); + assertEquals(testVideoDataList, result.getRows()); + + // 4. 验证业务层方法调用 + verify(dklVideoDataService, times(1)).selectDklVideoDataList(any(DklVideoData.class)); + } + + // ---------------------- 测试场景 2:导出列表(export 接口) ---------------------- + @Test + void export_ValidParam_InvokesExportExcel() { + // 1. 模拟 HttpServletResponse(Spring 提供的 Mock 类) + HttpServletResponse response = new MockHttpServletResponse(); + + // 2. Mock 业务层方法返回值 + when(dklVideoDataService.selectDklVideoDataList(any(DklVideoData.class))).thenReturn(testVideoDataList); + + // 3. 执行 Controller 方法(无返回值,验证方法调用即可) + dklVideoDataController.export(response, testVideoData); + + // 4. 验证业务层方法调用 + verify(dklVideoDataService, times(1)).selectDklVideoDataList(any(DklVideoData.class)); + // 注:ExcelUtil.exportExcel 是工具类,若需验证可 Mock ExcelUtil,此处优先验证核心业务调用 + } + + // ---------------------- 测试场景 3:获取详情(getInfo 接口) ---------------------- + @Test + void getInfo_ValidId_ReturnsSuccessAjaxResult() { + // 1. Mock 业务层方法返回值 + when(dklVideoDataService.selectDklVideoDataById(1)).thenReturn(testVideoData); + + // 2. 执行 Controller 方法 + AjaxResult result = dklVideoDataController.getInfo(1); + + // 3. 断言结果 + assertNotNull(result); + assertEquals(AjaxResult.Type.SUCCESS, result.getType()); // 验证返回成功状态 + assertEquals(testVideoData, result.getData()); // 验证返回数据正确 + + // 4. 验证业务层方法调用 + verify(dklVideoDataService, times(1)).selectDklVideoDataById(1); + } + + @Test + void getInfo_InvalidId_ReturnsSuccessWithNull() { + // 1. Mock 业务层方法返回 null(ID不存在场景) + when(dklVideoDataService.selectDklVideoDataById(999)).thenReturn(null); + + // 2. 执行 Controller 方法 + AjaxResult result = dklVideoDataController.getInfo(999); + + // 3. 断言结果 + assertNotNull(result); + assertEquals(AjaxResult.Type.SUCCESS, result.getType()); + assertNull(result.getData()); + + // 4. 验证业务层方法调用 + verify(dklVideoDataService, times(1)).selectDklVideoDataById(999); + } + + // ---------------------- 测试场景 4:新增数据(add 接口) ---------------------- + @Test + void add_ValidData_ReturnsAjaxResult() { + // 1. Mock 业务层方法返回 1(新增成功) + when(dklVideoDataService.insertDklVideoData(any(DklVideoData.class))).thenReturn(1); + + // 2. 执行 Controller 方法 + AjaxResult result = dklVideoDataController.add(testVideoData); + + // 3. 断言结果 + assertNotNull(result); + assertEquals(1, result.getData()); // toAjax(1) 返回成功(数据为1) + + // 4. 验证业务层方法调用 & 数据赋值 + verify(dklVideoDataService, times(1)).insertDklVideoData(any(DklVideoData.class)); + // 验证 Controller 自动赋值的系统字段 + assertEquals("0", testVideoData.getDelFlag()); + assertNotNull(testVideoData.getCreateTime()); + assertEquals("testUser", testVideoData.getCreateBy()); + assertEquals(100L, testVideoData.getDeptId()); + assertNotNull(testVideoData.getUpdateTime()); + assertEquals("testUser", testVideoData.getUpdateBy()); + } + + // ---------------------- 测试场景 5:修改数据(edit 接口) ---------------------- + @Test + void edit_ValidData_ReturnsAjaxResult() { + // 1. Mock 业务层方法返回 1(修改成功) + when(dklVideoDataService.updateDklVideoData(any(DklVideoData.class))).thenReturn(1); + + // 2. 执行 Controller 方法 + AjaxResult result = dklVideoDataController.edit(testVideoData); + + // 3. 断言结果 + assertNotNull(result); + assertEquals(1, result.getData()); + + // 4. 验证业务层方法调用 & 数据赋值 + verify(dklVideoDataService, times(1)).updateDklVideoData(any(DklVideoData.class)); + // 验证修改时的系统字段赋值 + assertNotNull(testVideoData.getUpdateTime()); + assertEquals("testUser", testVideoData.getUpdateBy()); + } + + // ---------------------- 测试场景 6:删除数据(remove 接口) ---------------------- + @Test + void remove_ValidIds_ReturnsAjaxResult() { + // 1. 准备删除ID数组 + int[] deleteIds = {1, 2}; + + // 2. Mock 业务层方法返回 2(删除2条成功) + when(dklVideoDataService.deleteDklVideoDataByIds(deleteIds)).thenReturn(2); + + // 3. 执行 Controller 方法 + AjaxResult result = dklVideoDataController.remove(deleteIds); + + // 4. 断言结果 + assertNotNull(result); + assertEquals(2, result.getData()); + + // 5. 验证业务层方法调用 + verify(dklVideoDataService, times(1)).deleteDklVideoDataByIds(deleteIds); + } + + @Test + void remove_EmptyIds_ReturnsAjaxResult() { + // 1. 空ID数组场景 + int[] emptyIds = {}; + + // 2. Mock 业务层方法返回 0(无数据删除) + when(dklVideoDataService.deleteDklVideoDataByIds(emptyIds)).thenReturn(0); + + // 3. 执行 Controller 方法 + AjaxResult result = dklVideoDataController.remove(emptyIds); + + // 4. 断言结果 + assertNotNull(result); + assertEquals(0, result.getData()); + + // 5. 验证业务层方法调用 + verify(dklVideoDataService, times(1)).deleteDklVideoDataByIds(emptyIds); + } +} \ No newline at end of file diff --git a/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/domain/DklVideoData.java b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/domain/DklVideoData.java new file mode 100644 index 0000000..5a37cd7 --- /dev/null +++ b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/domain/DklVideoData.java @@ -0,0 +1,60 @@ +package com.dkl.large.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.dkl.common.annotation.Excel; +import com.dkl.common.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 大客流视频数据获取对象 dkl_video_data + * + * @author Dkl + * @date 2025-06-06 + */ +@Data +public class DklVideoData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** id */ + private int id; + + /** 监控id */ + @Excel(name = "监控id") + private int videoId; + + /** 获取时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "获取时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date acquisitionTime; + + /** 人数 */ + @Excel(name = "人数") + private String numberPeople; + + /** 是否出现异常(跌倒/斗殴等) */ + @Excel(name = "是否出现异常(跌倒/斗殴等)") + private String isAbnormal; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 原数据 */ + @Excel(name = "原数据") + private String originalData; + + /** 部门id */ + @Excel(name = "部门id") + private Long deptId; + + /** 视频名称 */ + @TableField(exist = false) + private String videoName; + + +} diff --git a/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/mapper/DklVideoDataMapper.java b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/mapper/DklVideoDataMapper.java new file mode 100644 index 0000000..498afe0 --- /dev/null +++ b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/mapper/DklVideoDataMapper.java @@ -0,0 +1,97 @@ +package com.dkl.large.mapper; + +import java.util.List; +import com.dkl.large.domain.DklVideoData; +import com.dkl.large.domain.vo.DklMonitoringCameraDataVo; + +/** + * 大客流视频数据获取Mapper接口 + * + * @author Dkl + * @date 2025-06-06 + */ +public interface DklVideoDataMapper +{ + /** + * 查询大客流视频数据获取 + * + * @param id 大客流视频数据获取主键 + * @return 大客流视频数据获取 + */ + public DklVideoData selectDklVideoDataById(int id); + + /** + * 查询大客流视频数据获取列表 + * + * @param dklVideoData 大客流视频数据获取 + * @return 大客流视频数据获取集合 + */ + public List selectDklVideoDataList(DklVideoData dklVideoData); + + /** + * 新增大客流视频数据获取 + * + * @param dklVideoData 大客流视频数据获取 + * @return 结果 + */ + public int insertDklVideoData(DklVideoData dklVideoData); + + /** + * 修改大客流视频数据获取 + * + * @param dklVideoData 大客流视频数据获取 + * @return 结果 + */ + public int updateDklVideoData(DklVideoData dklVideoData); + + /** + * 删除大客流视频数据获取 + * + * @param id 大客流视频数据获取主键 + * @return 结果 + */ + public int deleteDklVideoDataById(int id); + + /** + * 批量删除大客流视频数据获取 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDklVideoDataByIds(int[] ids); + + /** + * @Author :rq + * @Description :监控点摄像头数据获取人员数量 + * @Date :2025/06/12 11:14 + * @Param :[] + * @return :java.lang.String + **/ + public String getDklVideoDataCount(); + + /** + * @Author :rq + * @Description :监控点摄像头数据获取人员数量 + * @Date :2025/06/12 11:14 + * @Param :[] + * @return :java.lang.String + **/ + public String getDklVideoDataPeopleCount(); + /** + * @Author :rq + * @Description :获取数据人数 时间段内 + * @Date :2025/06/12 13:35 + * @Param :[dklMonitoringCameraDataVo] + * @return :java.util.List + **/ + public List peopleDataStatisticsByActivity(DklMonitoringCameraDataVo dklMonitoringCameraDataVo); + + /** + * @Author :rq + * @Description :获取数据条数 时间段内 + * @Date :2025/06/12 13:35 + * @Param :[dklMonitoringCameraDataVo] + * @return :java.util.List + **/ + public List itemsDataStatisticsByActivity(DklMonitoringCameraDataVo dklMonitoringCameraDataVo); +} diff --git a/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/service/IDklVideoDataService.java b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/service/IDklVideoDataService.java new file mode 100644 index 0000000..c50458a --- /dev/null +++ b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/service/IDklVideoDataService.java @@ -0,0 +1,61 @@ +package com.dkl.large.service; + +import java.util.List; +import com.dkl.large.domain.DklVideoData; + +/** + * 大客流视频数据获取Service接口 + * + * @author Dkl + * @date 2025-06-06 + */ +public interface IDklVideoDataService +{ + /** + * 查询大客流视频数据获取 + * + * @param id 大客流视频数据获取主键 + * @return 大客流视频数据获取 + */ + public DklVideoData selectDklVideoDataById(int id); + + /** + * 查询大客流视频数据获取列表 + * + * @param dklVideoData 大客流视频数据获取 + * @return 大客流视频数据获取集合 + */ + public List selectDklVideoDataList(DklVideoData dklVideoData); + + /** + * 新增大客流视频数据获取 + * + * @param dklVideoData 大客流视频数据获取 + * @return 结果 + */ + public int insertDklVideoData(DklVideoData dklVideoData); + + /** + * 修改大客流视频数据获取 + * + * @param dklVideoData 大客流视频数据获取 + * @return 结果 + */ + public int updateDklVideoData(DklVideoData dklVideoData); + + /** + * 批量删除大客流视频数据获取 + * + * @param ids 需要删除的大客流视频数据获取主键集合 + * @return 结果 + */ + public int deleteDklVideoDataByIds(int[] ids); + + /** + * 删除大客流视频数据获取信息 + * + * @param id 大客流视频数据获取主键 + * @return 结果 + */ + public int deleteDklVideoDataById(int id); +} diff --git a/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/service/impl/DklVideoDataServiceImpl.java b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/service/impl/DklVideoDataServiceImpl.java new file mode 100644 index 0000000..d590359 --- /dev/null +++ b/Dkl-Vue-master/dkl-large/src/test/java/com/dkl/large/service/impl/DklVideoDataServiceImpl.java @@ -0,0 +1,96 @@ +package com.dkl.large.service.impl; + +import java.util.List; +import com.dkl.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.dkl.large.mapper.DklVideoDataMapper; +import com.dkl.large.domain.DklVideoData; +import com.dkl.large.service.IDklVideoDataService; + +/** + * 大客流视频数据获取Service业务层处理 + * + * @author Dkl + * @date 2025-06-06 + */ +@Service +public class DklVideoDataServiceImpl implements IDklVideoDataService +{ + @Autowired + private DklVideoDataMapper dklVideoDataMapper; + + /** + * 查询大客流视频数据获取 + * + * @param id 大客流视频数据获取主键 + * @return 大客流视频数据获取 + */ + @Override + public DklVideoData selectDklVideoDataById(int id) + { + return dklVideoDataMapper.selectDklVideoDataById(id); + } + + /** + * 查询大客流视频数据获取列表 + * + * @param dklVideoData 大客流视频数据获取 + * @return 大客流视频数据获取 + */ + @Override + public List selectDklVideoDataList(DklVideoData dklVideoData) + { + return dklVideoDataMapper.selectDklVideoDataList(dklVideoData); + } + + /** + * 新增大客流视频数据获取 + * + * @param dklVideoData 大客流视频数据获取 + * @return 结果 + */ + @Override + public int insertDklVideoData(DklVideoData dklVideoData) + { + dklVideoData.setCreateTime(DateUtils.getNowDate()); + return dklVideoDataMapper.insertDklVideoData(dklVideoData); + } + + /** + * 修改大客流视频数据获取 + * + * @param dklVideoData 大客流视频数据获取 + * @return 结果 + */ + @Override + public int updateDklVideoData(DklVideoData dklVideoData) + { + dklVideoData.setUpdateTime(DateUtils.getNowDate()); + return dklVideoDataMapper.updateDklVideoData(dklVideoData); + } + + /** + * 批量删除大客流视频数据获取 + * + * @param ids 需要删除的大客流视频数据获取主键 + * @return 结果 + */ + @Override + public int deleteDklVideoDataByIds(int[] ids) + { + return dklVideoDataMapper.deleteDklVideoDataByIds(ids); + } + + /** + * 删除大客流视频数据获取信息 + * + * @param id 大客流视频数据获取主键 + * @return 结果 + */ + @Override + public int deleteDklVideoDataById(int id) + { + return dklVideoDataMapper.deleteDklVideoDataById(id); + } +} diff --git a/Dkl-Vue-master/dkl-large/src/test/resources/mapper/large/DklVideoDataMapper.xml b/Dkl-Vue-master/dkl-large/src/test/resources/mapper/large/DklVideoDataMapper.xml new file mode 100644 index 0000000..8b7c5e6 --- /dev/null +++ b/Dkl-Vue-master/dkl-large/src/test/resources/mapper/large/DklVideoDataMapper.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + select dv.id, dv.video_id, dvi.name AS videoName,dv.acquisition_time, dv.number_people, dv.is_abnormal, dv.create_by, dv.create_time, dv.update_by, dv.update_time, dv.del_flag,dv.original_data, dv.dept_id from dkl_video_data dv + left join sys_dept d on dv.dept_id = d.dept_id + left join dkl_video dvi on dvi.id = dv.video_id + + + + + + + + insert into dkl_video_data + + video_id, + acquisition_time, + number_people, + is_abnormal, + create_by, + create_time, + update_by, + update_time, + del_flag, + original_data, + dept_id, + + + #{videoId}, + #{acquisitionTime}, + #{numberPeople}, + #{isAbnormal}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{delFlag}, + #{originalData}, + #{deptId}, + + + + + update dkl_video_data + + video_id = #{videoId}, + acquisition_time = #{acquisitionTime}, + number_people = #{numberPeople}, + is_abnormal = #{isAbnormal}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + del_flag = #{delFlag}, + original_data = #{originalData}, + dept_id = #{deptId}, + + where id = #{id} + + + + update dkl_video_data set del_flag = 2 where id = #{id} + + + + update dkl_video_data set del_flag = 2 where id in + + #{id} + + + + + + + + + + +