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

Spring Boot控制器单元测试报错:Failed to load ApplicationContext求助

解决Spring Boot单元测试中Failed to load ApplicationContext错误

嘿,我来帮你排查这个问题!你遇到的java.lang.IllegalStateException: Failed to load ApplicationContext错误,根源在于测试类里的Mock对象没有被正确注册到Spring测试上下文中,导致控制器无法找到依赖的Service实例,进而触发上下文加载失败。

先看一下你的测试代码里的核心问题:你用了@Mock注解来创建HelloService的Mock实例,但这个实例并没有被Spring容器管理,而控制器里的@Autowired又需要从Spring上下文中获取HelloService,这就导致了冲突。

解决方案:修改测试类的注解配置

把@Mock换成Spring Boot Test提供的@MockBean,并移除手动初始化Mockito的代码,修改后的测试类如下:

@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerTest {
    @Autowired
    private MockMvc mockMvc;
    
    @MockBean // 替换原来的@Mock
    private HelloService helloService;

    @Test
    public void sayHello() throws Exception {
        when(helloService.sayHello()).thenReturn("thach");
        mockMvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string("thach"));
    }
}

为什么这么改?

  • @MockBean是Spring Boot专门为测试提供的注解,它会自动把创建的Mock对象注册到Spring测试上下文中,这样控制器里的@Autowired就能正确注入这个Mock实例,而不会去尝试加载真实的HelloService(毕竟@WebMvcTest默认只加载Web层相关的Bean,不会自动扫描Service层)。
  • 移除MockitoAnnotations.initMocks(this);是因为@MockBean已经由Spring自动处理Mock对象的初始化了,不需要手动调用这段代码。

额外排查点

如果修改后还是报错,你可以检查一下:

  • 测试类的包结构是否和主应用类(带@SpringBootApplication的类)在同一个父包下,比如主类在com.example.demo,测试类最好也在com.example.demo或者其子包下,这样Spring才能扫描到控制器类。
  • 确认你的Spring Boot版本和JUnit4的兼容性,建议使用Spring Boot 2.x以上版本配合JUnit4,版本过低可能会有注解兼容问题。

你提供的报错堆栈里的核心提示也说明了问题:
Caused by: java.lang.IllegalArgumentException: Cannot load an ApplicationContext with a NULL 'contextLoader'. Consider annotating your test class with @ContextConfiguration or @ContextHierarchy.
其实@WebMvcTest已经包含了上下文配置,但因为Mock对象没被正确注册,导致上下文初始化失败,所以才会抛出这个提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:32:52