Spring Boot测试中配置类被忽略,adapterConfig为空问题
问题原因分析与解决方案
这个问题的核心在于你使用的@WebMvcTest注解的设计特性——它是Spring MVC切片测试注解,只会初始化和Spring MVC直接相关的组件(比如你的StudentController、Spring MVC的核心配置等),并不会加载完整的应用上下文:
- 它会自动排除大部分
@Configuration类,包括你自定义的SpringBootKeycloakConfigResolver; - 同时,Keycloak自动配置的
AdapterConfigbean也不会被初始化,因为切片测试默认不会引入非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
相关产品推荐
相关产品推荐

