You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MVC/StudentManagementTest.java

163 lines
5.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<Student> allStudents = studentDAO.getAllStudents();
assertNotNull(allStudents);
// 至少应该有示例数据中的学生
assertTrue(allStudents.size() >= 3);
}
@Test
public void testFilterStudentsByCourse() {
// 使用示例数据中的"数学"课程进行测试
List<Student> mathStudents = studentDAO.getStudentsByCourse("数学");
assertNotNull(mathStudents);
// 示例数据中所有学生都应该选修了数学
assertTrue(mathStudents.size() >= 3);
// 测试不存在的课程
List<Student> noStudents = studentDAO.getStudentsByCourse("不存在的课程");
assertTrue(noStudents.isEmpty());
}
@Test
public void testFilterStudentsByGradeRange() {
// 测试80-90分的学生
List<Student> 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<Student> 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); // 使用容差处理浮点数比较
}
}