JUnit测试失败求助:任务创建、名称/描述更新测试问题排查
JUnit测试TaskService时创建、名称/描述更新用例失败的问题排查
课程作业中使用JUnit测试TaskService代码,目前任务创建、名称更新、描述更新三个测试用例失败,但唯一ID验证和删除功能测试正常,调整测试执行顺序无效。以下是实现代码和测试代码,寻求技术指导:
TaskService实现代码
public class TaskService { //variables public static String taskId; public String taskName; public String taskDescrip; //create an array for task list static ArrayList<Task> taskList = new ArrayList<Task>(0); //creates unique IDs public static String generateUniqueId() { String uniqueId; //pulls the latest Id value in array as long as its not empty if (taskList.isEmpty()) { taskId = "1000000000"; } else { int arraySize = taskList.size(); taskId = taskList.get(arraySize - 1).getId(); } // this will convert the id string into a integer to increment (making new id) then change it back to a string int tempInt = Integer.valueOf(taskId); tempInt += 1; uniqueId = Integer.toString(tempInt); return uniqueId; } //creates task public static void addTask(String name, String descrip) { String Id = generateUniqueId(); Task Task1 = new Task(Id, name, descrip); taskList.add(Task1); } //add task public static void addTask(Task newTask) { String tempId = newTask.getId(); for (int i = 0; i < taskList.size(); i++) { if (tempId.equals(taskList.get(i).getId())) { throw new IllegalArgumentException("Id must be unique"); } } taskList.add(newTask); } //updates name public static void updateName(String uniqueId, String taskName) { for (int i = 0; i < taskList.size(); i++) { if (uniqueId.compareTo(taskList.get(i).getId()) == 0) { taskList.get(i).setName(taskName); } } } //updates description public static void updateDescrip(String uniqueId, String taskDescrip) { for (int i = 0; i < taskList.size(); i++) { if (uniqueId.compareTo(taskList.get(i).getId()) == 0) { taskList.get(i).setName(taskDescrip); } } } //deletes task public static void deleteTask(String uniqueId) { for (int i = 0; i < taskList.size(); i++) { if (uniqueId.compareTo(taskList.get(i).getId()) == 0) { int position = i; taskList.remove(position); } } } //search function for testing public static int searchTask(String uniqueId) { int result = 0; for (int i = 0; i < taskList.size(); i++) { if (uniqueId.compareTo(taskList.get(i).getId()) == 0) { result = 1; } else { result = 2; } } return result; } }
测试代码
public class TaskServiceTest { //Creation Test @Test @DisplayName("Task Creation") void testTaskServiceClass() { TaskService.addTask("Task Name", "Task Description"); assertTrue(TaskService.taskList.get(0).getId().equals("1000000001")); assertTrue(TaskService.taskList.get(0).getName().equals("Task Name")); assertTrue(TaskService.taskList.get(0).getDescrip().equals("Task Description")); } //Deletion Test @Test @DisplayName("Deletion Test") void testTaskServiceDelete() { TaskService.addTask("Task Service", "Testing Task Service"); int size = TaskService.taskList.size(); TaskService.deleteTask("1000000002"); assertTrue(TaskService.searchTask("1000000002") == 2); } //Test- update name @Test @DisplayName("Update name") void testTaskServiceUpdateName() { TaskService.addTask("Test 1", "Description"); int size = TaskService.taskList.size(); System.out.println(TaskService.taskList.get(size - 1).getId()); System.out.println(TaskService.taskList.get(size - 1).getName()); TaskService.updateName("1000000002", "Update Name"); System.out.println(TaskService.taskList.get(size - 1).getName()); assertTrue(TaskService.taskList.get(size - 1).getDescrip().equals("Update Name")); } //Test- update description @Test @DisplayName("Update Description") void testTaskServiceUpdateDescrip() { TaskService.addTask("Test 1", "testing description"); int size = TaskService.taskList.size(); System.out.println(TaskService.taskList.get(size - 1).getId()); System.out.println(TaskService.taskList.get(size - 1).getDescrip()); TaskService.updateDescrip("1000000002", "testing update description"); System.out.println(TaskService.taskList.get(size - 1).getDescrip()); assertTrue(TaskService.taskList.get(size - 1).getDescrip().equals("testing update description")); } // test- unique id @Test @DisplayName("Unique Id") void testTaskServiceUniqueId() { Task newTask = new Task("12345", "New Task", "Testing for unique Id"); TaskService.addTask(newTask); Task duplicateId = new Task("12345", "New Task", "Testing for Id"); Assertions.assertThrows(IllegalArgumentException.class, () -> { TaskService.addTask(duplicateId); }); } }
问题排查与修复方案
1. 业务代码中的错误
- updateDescrip方法逻辑错误:更新描述时错误调用了
setName,应改为调用setDescrip:public static void updateDescrip(String uniqueId, String taskDescrip) { for (int i = 0; i < taskList.size(); i++) { if (uniqueId.compareTo(taskList.get(i).getId()) == 0) { taskList.get(i).setDescrip(taskDescrip); // 修复此处 } } } - searchTask方法逻辑错误:遍历列表时,后续不匹配的元素会覆盖之前的匹配结果,导致误判。应找到匹配项后立即退出循环:
public static int searchTask(String uniqueId) { int result = 2; // 默认未找到 for (int i = 0; i < taskList.size(); i++) { if (uniqueId.compareTo(taskList.get(i).getId()) == 0) { result = 1; break; // 找到后立即退出循环 } } return result; }
2. 测试代码中的错误
- 测试用例未隔离:静态的
taskList被所有测试共享,前序测试的任务会干扰后续测试。需在每个测试前清空列表:@BeforeEach void setUp() { TaskService.taskList.clear(); } - updateName测试断言错误:更新名称后错误断言描述字段,应改为断言名称字段:
assertTrue(TaskService.taskList.get(size - 1).getName().equals("Update Name")); - 硬编码ID依赖执行顺序:测试中固定使用
1000000002这类ID,一旦测试顺序变化就会失效。应动态获取新增任务的ID:void testTaskServiceUpdateName() { TaskService.addTask("Test 1", "Description"); Task addedTask = TaskService.taskList.get(TaskService.taskList.size() - 1); String taskId = addedTask.getId(); TaskService.updateName(taskId, "Update Name"); assertTrue(addedTask.getName().equals("Update Name")); }
3. 其他优化点
generateUniqueId中的静态taskId无需全局维护,改为局部变量避免不必要的状态污染:public static String generateUniqueId() { String currentId = taskList.isEmpty() ? "1000000000" : taskList.get(taskList.size() - 1).getId(); int tempInt = Integer.valueOf(currentId); return Integer.toString(tempInt + 1); }
内容的提问来源于stack exchange,提问作者Kait
相关产品推荐
相关产品推荐

