SpringBoot JUnit测试中@Autowired注入为空问题求助
解决Spring Boot JUnit测试中@Autowired对象为null的问题
嘿,我一眼就看出问题出在哪了——你手动用new APIController()创建了控制器实例,这个实例不在Spring容器的管理范围内,所以控制器里面用@Autowired标注的依赖自然不会被Spring注入,结果就是null。
下面给你两种正确的解决方式,按需选择:
方式一:让Spring自动注入控制器实例
直接把测试类改成这样,让Spring帮你管理控制器实例,而不是自己手动new:
@RunWith(SpringRunner.class) @SpringBootTest public class TestingJunit { // 让Spring容器自动注入APIController实例 @Autowired private APIController apiController; @Test public void testing() { ResponseEntity<?> prod = apiController.getNames(8646, 1); List<TestVO> ff = (List<TestVO>) prod.getBody(); // 这里可以添加你的断言逻辑,比如验证列表不为空、元素数量符合预期等 // assertNotNull(ff); // assertEquals(预期的元素数量, ff.size()); } }
这样Spring会负责初始化APIController,并自动注入它里面所有标记了@Autowired的依赖,null问题就解决了。
方式二:用MockMvc测试API接口(更推荐的控制器测试方案)
如果你的核心需求是测试API接口的功能,而非单纯调用控制器方法,更推荐用MockMvc模拟HTTP请求,这更贴近真实的接口调用场景:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class TestingJunit { @Autowired private MockMvc mockMvc; @Test public void testing() throws Exception { // 模拟GET请求,替换成你实际的接口路径和参数 mockMvc.perform(get("/api/names") .param("id", "8646") .param("page", "1")) .andExpect(status().isOk()) // 验证响应状态码是200 .andExpect(jsonPath("$").isArray()) // 验证返回的是数组格式 // 还可以添加更细致的断言,比如检查返回列表中第一个元素的某个字段 // .andExpect(jsonPath("$[0].name").value("预期的名称")); } }
这种方式不需要直接操作控制器实例,而是模拟用户发送HTTP请求,能更全面地验证接口的响应状态、返回格式和内容。
额外要注意的小细节
- 确保你的
APIController类上标注了@RestController或@Controller注解,这样Spring才能扫描到它并纳入容器管理。 - 如果控制器依赖的其他类(比如Service、Repository),也要确保这些类标注了
@Service、@Repository等Spring组件注解,保证它们也在容器中。
内容的提问来源于stack exchange,提问作者user2000189
相关产品推荐
相关产品推荐

