Spring Boot单元测试报错:无法调用方法,因taskService为null
问题原因及解决办法
核心问题
你的测试类混用了Spring Boot集成测试注解和Mockito单元测试注解,导致taskService没有被正确初始化,触发空指针异常。
具体修复步骤
调整测试注解:
- 把
@MockBean换成Mockito的@Mock(@MockBean是Spring Boot集成测试专用,单元测试无需启动Spring容器) - 移除
taskService上的@Autowired,仅保留@InjectMocks(Mockito会自动将Mock的taskRepository注入到taskService实例中) - 添加
@ExtendWith(MockitoExtension.class),让Mockito负责处理注解初始化逻辑
- 把
Mock仓库方法返回值:
必须指定taskRepository.save()的返回结果,否则调用createTask会返回null,后续断言也会失败。修正断言写法:
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
相关产品推荐
相关产品推荐

