Spring Boot Sping Boot MockMvc测试中缺少H2ConsoleProperties bean

9gm1akwq  于 2023-10-16  发布在  Spring
关注(0)|答案(1)|浏览(106)

我有spring Boot 应用程序(mvc,thymeleaf,data jpa,h2),配置允许所有用户访问h2-console:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    PathRequest.H2ConsoleRequestMatcher h2ConsoleRequestMatcher = PathRequest.toH2Console();
    http.authorizeHttpRequests(requests -> requests
            .requestMatchers("/").permitAll()
            .requestMatchers(h2ConsoleRequestMatcher).permitAll()
            .anyRequest().authenticated()
    );
    http.csrf(csrf -> csrf.ignoringRequestMatchers(h2ConsoleRequestMatcher));
    http.headers().frameOptions().sameOrigin();
    //...
    
    return http.build();
}

我也有测试,我想验证,h2-console是可访问的:
@SpringBootTest @AutoConfigureMockMvc class SecurityApplicationTests {

@Autowired
MockMvc mockMvc;

@Test
void shouldAccessH2Console() throws Exception {
    mockMvc.perform(get("/h2-console"))
            .andExpect(status().isOk());
}

}
当我运行测试时,我得到了NoSuchBeanaberrationException:
No qualifying bean of type 'org.springframework.boot.autoconfigure.h2.H2ConsoleProperties' available
但是如果我从main()启动应用程序,一切都像预期的那样工作,我可以从浏览器访问H2。
我希望@SpringBootTest@SpringBootApplication一样提供完整的应用程序上下文
为什么在测试中没有创建H2 ConsoleProperties bean,我如何解决这个问题?

mkshixfv

mkshixfv1#

我也遇到了同样的问题,在运行Sping Boot 测试时遇到了完全相同的异常,但是当只通过main运行应用程序时,一切都很好。
对我来说,解决这个问题的办法是

spring.h2.console.enabled=true

正如在www.example.com上所描述https://www.baeldung.com/spring-boot-h2-database#h2-console,控制台默认情况下是不启用的,因此必须设置这个属性(尽管我可以访问控制台,即使没有设置属性..)。但我认为这是问题的根源。当控制台未启用时,自动配置不可用,并且在安全配置中配置PathRequest.toH2Console()时,会发生异常。当显式启用控制台时,H2ConsoleProperties也可用。
也许会有帮助

相关问题