package com.studentmanagement; import com.studentmanagement.exception.DuplicateStudentException; import com.studentmanagement.exception.StudentNotFoundException; import com.studentmanagement.model.Student; import com.studentmanagement.model.StudentDAO; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.List; import static org.junit.jupiter.api.Assertions.*; /** * 学生管理系统测试类 * 使用JUnit 5测试学生管理系统的核心功能 */ public class StudentManagementTest { private StudentDAO studentDAO; @BeforeEach public void setUp() { // 使用单例的StudentDAO实例 studentDAO = StudentDAO.getInstance(); // 为了确保测试的独立性,我们可以清理现有的数据 // 注意:在实际项目中,可能需要更复杂的测试数据管理策略 } @Test public void testAddAndGetStudent() throws DuplicateStudentException, StudentNotFoundException { // 创建测试学生 Student testStudent = new Student("999", "测试学生", 20, "男"); testStudent.addCourseGrade("数学", 90.5); // 添加学生 studentDAO.addStudent(testStudent); // 获取学生并验证 Student retrievedStudent = studentDAO.getStudentById("999"); assertNotNull(retrievedStudent); assertEquals("测试学生", retrievedStudent.getName()); assertEquals(90.5, retrievedStudent.getCourseGrade("数学")); // 清理测试数据 studentDAO.deleteStudent("999"); } @Test public void testDuplicateStudentException() throws DuplicateStudentException { // 创建测试学生 Student testStudent = new Student("888", "重复测试", 21, "女"); studentDAO.addStudent(testStudent); // 尝试添加相同ID的学生,应该抛出异常 Student duplicateStudent = new Student("888", "重复的学生", 22, "男"); assertThrows(DuplicateStudentException.class, () -> { studentDAO.addStudent(duplicateStudent); }); // 清理测试数据 try { studentDAO.deleteStudent("888"); } catch (StudentNotFoundException e) { // 忽略异常 } } @Test public void testStudentNotFoundException() { // 尝试获取不存在的学生,应该抛出异常 assertThrows(StudentNotFoundException.class, () -> { studentDAO.getStudentById("不存在的ID"); }); } @Test public void testUpdateStudent() throws DuplicateStudentException, StudentNotFoundException { // 创建并添加测试学生 Student testStudent = new Student("777", "要更新的学生", 19, "男"); studentDAO.addStudent(testStudent); // 更新学生信息 Student updatedStudent = new Student("777", "更新后的学生", 20, "男"); updatedStudent.addCourseGrade("物理", 85.0); studentDAO.updateStudent(updatedStudent); // 验证更新是否成功 Student retrievedStudent = studentDAO.getStudentById("777"); assertEquals("更新后的学生", retrievedStudent.getName()); assertEquals(20, retrievedStudent.getAge()); assertEquals(85.0, retrievedStudent.getCourseGrade("物理")); // 清理测试数据 studentDAO.deleteStudent("777"); } @Test public void testDeleteStudent() throws DuplicateStudentException, StudentNotFoundException { // 创建并添加测试学生 Student testStudent = new Student("666", "要删除的学生", 22, "女"); studentDAO.addStudent(testStudent); // 删除学生 studentDAO.deleteStudent("666"); // 验证学生已被删除 assertThrows(StudentNotFoundException.class, () -> { studentDAO.getStudentById("666"); }); } @Test public void testGetAllStudents() { // 获取所有学生 List allStudents = studentDAO.getAllStudents(); assertNotNull(allStudents); // 至少应该有示例数据中的学生 assertTrue(allStudents.size() >= 3); } @Test public void testFilterStudentsByCourse() { // 使用示例数据中的"数学"课程进行测试 List mathStudents = studentDAO.getStudentsByCourse("数学"); assertNotNull(mathStudents); // 示例数据中所有学生都应该选修了数学 assertTrue(mathStudents.size() >= 3); // 测试不存在的课程 List noStudents = studentDAO.getStudentsByCourse("不存在的课程"); assertTrue(noStudents.isEmpty()); } @Test public void testFilterStudentsByGradeRange() { // 测试80-90分的学生 List studentsInRange = studentDAO.getStudentsByGradeRange(80.0, 90.0); assertNotNull(studentsInRange); // 验证筛选结果是否在范围内 for (Student student : studentsInRange) { double avgGrade = student.calculateAverageGrade(); assertTrue(avgGrade >= 80.0 && avgGrade <= 90.0); } // 测试不可能的范围 List noStudents = studentDAO.getStudentsByGradeRange(100.0, 110.0); assertTrue(noStudents.isEmpty()); } @Test public void testCalculateAverageGrade() { // 创建一个测试学生,添加成绩并计算平均成绩 Student testStudent = new Student("555", "平均成绩测试", 20, "男"); testStudent.addCourseGrade("数学", 80.0); testStudent.addCourseGrade("英语", 90.0); testStudent.addCourseGrade("计算机", 85.0); double avgGrade = testStudent.calculateAverageGrade(); assertEquals(85.0, avgGrade, 0.01); // 使用容差处理浮点数比较 } }