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

Spring Boot测试中配置类被忽略,adapterConfig为空问题

问题原因分析与解决方案

这个问题的核心在于你使用的@WebMvcTest注解的设计特性——它是Spring MVC切片测试注解,只会初始化和Spring MVC直接相关的组件(比如你的StudentController、Spring MVC的核心配置等),并不会加载完整的应用上下文:

  • 它会自动排除大部分@Configuration类,包括你自定义的SpringBootKeycloakConfigResolver;
  • 同时,Keycloak自动配置的AdapterConfig bean也不会被初始化,因为切片测试默认不会引入非Web层的自动配置。

而正常启动(mvn spring-boot:run)时,Spring Boot会加载完整的应用上下文,所有@Configuration类和自动配置的bean都会被扫描、初始化,所以AdapterConfig能正常注入。

解决方案

方案1:在切片测试中手动导入所需配置

如果你想继续使用@WebMvcTest(保持测试启动速度),可以通过@Import注解手动导入需要的配置类和bean,同时确保AdapterConfig能被正确加载:

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = StudentController.class)
// 导入Keycloak配置类和AdapterConfig
@Import({SpringBootKeycloakConfigResolver.class, AdapterConfig.class})
// 如果AdapterConfig是通过@ConfigurationProperties绑定配置文件的,需要开启属性绑定
@EnableConfigurationProperties(AdapterConfig.class)
public class StudentControllerTests {
    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private StudentService service;

    @MockBean
    private StudentRepository repository;

    @Test
    public void shouldReturnABC() throws Exception{
        MvcResult result = this.mockMvc.perform(get("/students/abc")).andReturn();
    }
}

方案2:使用完整应用上下文测试

如果你的测试需要依赖更多非Web层的配置,或者不想手动导入大量配置,可以改用@SpringBootTest结合@AutoConfigureMockMvc,它会加载完整的应用上下文,所有配置类和自动配置bean都会被初始化:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class StudentControllerTests {
    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private StudentService service;

    @MockBean
    private StudentRepository repository;

    @Test
    public void shouldReturnABC() throws Exception{
        MvcResult result = this.mockMvc.perform(get("/students/abc")).andReturn();
    }
}

注意:这个方案的测试启动速度会比切片测试慢,但胜在配置简单,适合需要完整上下文的场景。

内容的提问来源于stack exchange,提问作者R. Polito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:22:40