测试用例

This commit is contained in:
lvys 2025-01-24 11:10:23 +08:00
parent c86a8156b8
commit 7d20057de0
6 changed files with 687 additions and 0 deletions

View File

@ -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<DklVideoData> 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. 模拟 HttpServletResponseSpring 提供的 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 业务层方法返回 nullID不存在场景
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);
}
}

View File

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

View File

@ -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<DklVideoData> 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<com.dkl.large.domain.vo.DklMonitoringCameraDataVo>
**/
public List<DklMonitoringCameraDataVo> peopleDataStatisticsByActivity(DklMonitoringCameraDataVo dklMonitoringCameraDataVo);
/**
* @Author :rq
* @Description :获取数据条数 时间段内
* @Date :2025/06/12 13:35
* @Param :[dklMonitoringCameraDataVo]
* @return :java.util.List<com.dkl.large.domain.vo.DklMonitoringCameraDataVo>
**/
public List<DklMonitoringCameraDataVo> itemsDataStatisticsByActivity(DklMonitoringCameraDataVo dklMonitoringCameraDataVo);
}

View File

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

View File

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

View File

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dkl.large.mapper.DklVideoDataMapper">
<resultMap type="DklVideoData" id="DklVideoDataResult">
<result property="id" column="id" />
<result property="videoId" column="video_id" />
<result property="acquisitionTime" column="acquisition_time" />
<result property="numberPeople" column="number_people" />
<result property="isAbnormal" column="is_abnormal" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="delFlag" column="del_flag" />
<result property="originalData" column="original_data" />
<result property="deptId" column="dept_id" />
</resultMap>
<sql id="selectDklVideoDataVo">
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
</sql>
<select id="selectDklVideoDataList" parameterType="DklVideoData" resultMap="DklVideoDataResult">
<include refid="selectDklVideoDataVo"/>
<where>
<if test="videoId != null and videoId != ''"> and dv.video_id = #{videoId}</if>
<if test="acquisitionTime != null and acquisitionTime != ''"> and dv.acquisition_time = #{acquisitionTime}</if>
<if test="numberPeople != null and numberPeople != ''"> and dv.number_people = #{numberPeople}</if>
<if test="isAbnormal != null and isAbnormal != ''"> and dv.is_abnormal = #{isAbnormal}</if>
<if test="originalData != null and originalData != ''"> and dv.original_data = #{originalData}</if>
<if test="deptId != null "> and dv.dept_id = #{deptId}</if>
<if test="delFlag != null and delFlag != ''"> and dv.del_flag = #{delFlag}</if>
</where>
<!-- 数据范围过滤 -->
${params.dataScope}
order by dv.create_time desc
</select>
<select id="selectDklVideoDataById" parameterType="int" resultMap="DklVideoDataResult">
<include refid="selectDklVideoDataVo"/>
where dv.id = #{id}
</select>
<insert id="insertDklVideoData" parameterType="DklVideoData">
insert into dkl_video_data
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="videoId != null">video_id,</if>
<if test="acquisitionTime != null">acquisition_time,</if>
<if test="numberPeople != null">number_people,</if>
<if test="isAbnormal != null">is_abnormal,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="delFlag != null">del_flag,</if>
<if test="originalData != null">original_data,</if>
<if test="deptId != null">dept_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="videoId != null">#{videoId},</if>
<if test="acquisitionTime != null">#{acquisitionTime},</if>
<if test="numberPeople != null">#{numberPeople},</if>
<if test="isAbnormal != null">#{isAbnormal},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="delFlag != null">#{delFlag},</if>
<if test="originalData != null">#{originalData},</if>
<if test="deptId != null">#{deptId},</if>
</trim>
</insert>
<update id="updateDklVideoData" parameterType="DklVideoData">
update dkl_video_data
<trim prefix="SET" suffixOverrides=",">
<if test="videoId != null">video_id = #{videoId},</if>
<if test="acquisitionTime != null">acquisition_time = #{acquisitionTime},</if>
<if test="numberPeople != null">number_people = #{numberPeople},</if>
<if test="isAbnormal != null">is_abnormal = #{isAbnormal},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="originalData != null">original_data = #{originalData},</if>
<if test="deptId != null">dept_id = #{deptId},</if>
</trim>
where id = #{id}
</update>
<update id="deleteDklVideoDataById" parameterType="int">
update dkl_video_data set del_flag = 2 where id = #{id}
</update>
<update id="deleteDklVideoDataByIds" parameterType="int">
update dkl_video_data set del_flag = 2 where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</update>
<select id="getDklVideoDataCount" parameterType="string">
SELECT COUNT(*) FROM dkl_video_data WHERE del_flag = '0'
</select>
<select id="getDklVideoDataPeopleCount" parameterType="string">
SELECT sum(number_people) FROM dkl_video_data WHERE del_flag = '0'
</select>
<select id="peopleDataStatisticsByActivity" resultType="DklMonitoringCameraDataVo">
SELECT SUM
( number_people ) as numberPeople,
to_char( acquisition_time, 'YYYY-MM-DD' ) as acquisitionTime
FROM
dkl_video_data
WHERE
del_flag = '0'
<if test="startTime!=null">
AND acquisition_time BETWEEN #{startTime}
AND #{endTime}
</if>
GROUP BY
acquisitionTime
ORDER BY acquisitionTime DESC
</select>
<select id="itemsDataStatisticsByActivity" resultType="DklMonitoringCameraDataVo">
SELECT COUNT(*) as numberItems,
to_char( acquisition_time, 'YYYY-MM-DD' ) AS acquisitionTime
FROM
dkl_video_data
WHERE
del_flag = '0'
<if test="startTime!=null">
AND acquisition_time BETWEEN #{startTime}
AND #{endTime}
</if>
GROUP BY
acquisitionTime
ORDER BY acquisitionTime DESC
</select>
</mapper>