package test.dao.impl; import dao.impl.LeaveRequestDAOImpl; import dao.impl.StudentDAOImpl; import model.ApprovalStatus; import model.LeaveRequest; import model.Student; import org.junit.After; import org.junit.Before; import org.junit.Test; import util.DatabaseUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; import java.util.List; import static org.junit.Assert.*; /** * LeaveRequestDAOImpl的单元测试类 * 测试请假申请数据访问层的各项功能 */ public class LeaveRequestDAOImplTest { private LeaveRequestDAOImpl leaveRequestDAO; private StudentDAOImpl studentDAO; private Student testStudent; @Before public void setUp() throws SQLException { leaveRequestDAO = new LeaveRequestDAOImpl(); studentDAO = new StudentDAOImpl(); // 清理测试数据 cleanTestData(); // 创建测试用学生 testStudent = createAndInsertTestStudent(); } @After public void tearDown() throws SQLException { cleanTestData(); } /** * 清理测试数据 */ private void cleanTestData() throws SQLException { try (Connection conn = DatabaseUtil.getConnection()) { // 删除请假记录 try (PreparedStatement stmt = conn.prepareStatement("DELETE FROM leave_requests WHERE student_id IN (SELECT id FROM students WHERE student_id = ?)")) { stmt.setString(1, "2024001"); stmt.executeUpdate(); } // 删除测试学生 try (PreparedStatement stmt = conn.prepareStatement("DELETE FROM students WHERE student_id = ?")) { stmt.setString(1, "2024001"); stmt.executeUpdate(); } } } /** * 创建并插入测试用的Student对象 */ private Student createAndInsertTestStudent() { Student student = new Student(); student.setStudentId("2024001"); student.setName("张三"); student.setClassName("计算机科学与技术1班"); student.setContact("13800138000"); student.setCollege("信息科学与工程学院"); student.setMajor("计算机科学与技术"); student.setPassword("password123"); studentDAO.insert(student); return student; } /** * 创建测试用的LeaveRequest对象 */ private LeaveRequest createTestLeaveRequest() { LeaveRequest request = new LeaveRequest(); request.setStudent(testStudent); request.setStartTime(new Date()); request.setEndTime(new Date(System.currentTimeMillis() + 86400000)); // 一天后 request.setStatus(ApprovalStatus.PENDING); request.setDuration(24.0); request.setLocation("北京市海淀区"); request.setReasonType("事假"); request.setReasonDetail("参加亲属婚礼"); request.setLeavingCity(false); request.setRequestTime(new Date()); return request; } @Test public void testInsert() { // 准备测试数据 LeaveRequest request = createTestLeaveRequest(); // 执行插入操作 int result = leaveRequestDAO.insert(request); // 验证结果 assertEquals(1, result); assertTrue(request.getId() > 0); // 验证数据是否正确插入 List requests = leaveRequestDAO.findByStudentId(testStudent.getId()); assertFalse(requests.isEmpty()); LeaveRequest foundRequest = requests.get(0); assertEquals(request.getStudent().getId(), foundRequest.getStudent().getId()); assertEquals(request.getStatus(), foundRequest.getStatus()); assertEquals(request.getLocation(), foundRequest.getLocation()); assertEquals(request.getReasonType(), foundRequest.getReasonType()); assertEquals(request.getReasonDetail(), foundRequest.getReasonDetail()); assertEquals(request.isLeavingCity(), foundRequest.isLeavingCity()); } @Test public void testFindByStudentId() { // 准备测试数据 LeaveRequest request1 = createTestLeaveRequest(); LeaveRequest request2 = createTestLeaveRequest(); leaveRequestDAO.insert(request1); leaveRequestDAO.insert(request2); // 执行查询操作 List requests = leaveRequestDAO.findByStudentId(testStudent.getId()); // 验证结果 assertEquals(2, requests.size()); for (LeaveRequest request : requests) { assertEquals(testStudent.getId(), request.getStudent().getId()); assertEquals(testStudent.getName(), request.getStudent().getName()); } } @Test public void testFindByStudentIdNotFound() { // 查询不存在的学生ID List requests = leaveRequestDAO.findByStudentId(-1); // 验证结果 assertTrue(requests.isEmpty()); } @Test public void testInsertWithNullStudent() { // 准备测试数据 LeaveRequest request = createTestLeaveRequest(); request.setStudent(null); // 执行插入操作 int result = leaveRequestDAO.insert(request); // 验证结果 assertEquals(0, result); } @Test public void testUpdateStatus() { // 准备测试数据 LeaveRequest request = createTestLeaveRequest(); leaveRequestDAO.insert(request); // 执行更新操作 String comment = "同意请假申请"; int result = leaveRequestDAO.updateStatus(request.getId(), ApprovalStatus.APPROVED, comment); // 验证结果 assertEquals(1, result); // 验证状态是否正确更新 List requests = leaveRequestDAO.findByStudentId(testStudent.getId()); assertFalse(requests.isEmpty()); LeaveRequest updatedRequest = requests.get(0); assertEquals(ApprovalStatus.APPROVED, updatedRequest.getStatus()); assertEquals(comment, updatedRequest.getApproverComment()); } @Test public void testUpdateStatusNotFound() { // 测试更新不存在的记录 int result = leaveRequestDAO.updateStatus(-1, ApprovalStatus.APPROVED, "测试评论"); // 验证结果 assertEquals(0, result); } }