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

Spring Boot单元测试报错:无法调用方法,因taskService为null

问题原因及解决办法

核心问题

你的测试类混用了Spring Boot集成测试注解和Mockito单元测试注解,导致taskService没有被正确初始化,触发空指针异常。

具体修复步骤

  1. 调整测试注解:

    • 把@MockBean换成Mockito的@Mock(@MockBean是Spring Boot集成测试专用,单元测试无需启动Spring容器)
    • 移除taskService上的@Autowired,仅保留@InjectMocks(Mockito会自动将Mock的taskRepository注入到taskService实例中)
    • 添加@ExtendWith(MockitoExtension.class),让Mockito负责处理注解初始化逻辑
  2. Mock仓库方法返回值:
    必须指定taskRepository.save()的返回结果,否则调用createTask会返回null,后续断言也会失败。

  3. 修正断言写法:
    Java原生assert语法使用错误,改用JUnit的Assertions.assertEquals更规范,且能输出清晰的错误提示。

修改后的测试类代码

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
class TaskServiceTest {
    @Mock
    private TaskRepository taskRepository;
    @InjectMocks
    private TaskService taskService;

    @Test
    void createTask() {
        Task task = new Task("bzbz", "some more bzbz");
        // 指定save方法的返回值
        when(taskRepository.save(task)).thenReturn(task);

        Task returnedTask = taskService.createTask(task);

        assertEquals("bzbz", returnedTask.getTitle());
    }
}

额外优化建议

建议把TaskService的字段注入改成构造函数注入,这样更利于测试和依赖管理:

@Service
public class TaskService implements ITaskService {
    private final TaskRepository taskRepository;

    // 构造函数注入
    public TaskService(TaskRepository taskRepository) {
        this.taskRepository = taskRepository;
    }

    // 原有业务方法不变
}

内容的提问来源于stack exchange,提问作者user19163958

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:55:21