You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:18:10