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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:22:01