spring-boot - 我的 @WebMvcTest 测试类如何在 Spring Boot 中使用此 JDBC 身份验证配置进行初始化?
问题描述
我已经将我的 Spring Boot 应用程序配置为使用本地数据库进行身份验证,并且它可以工作(有一个警告,请参见我的另一个问题),但并非我的所有测试类都适用于新配置。
这是配置的相关部分(请在此处查看全部内容):
@Autowired
private DataSource dataSource;
@Override
public void configure(AuthenticationManagerBuilder builder) throws Exception {
builder .jdbcAuthentication()
.dataSource(dataSource)
.withUser(User.withUsername("admin").password(passwordEncoder().encode("pass")).roles("SUPER"));
logger.debug("Configured app to use JDBC authentication with default database.");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
用@SpringBootTest
和@AutoConfigureMockMvc
工作的测试类(例如,这个)。据我了解,这些会自动配置应用程序的各种 Bean 并将它们一起测试(一种集成测试形式)。
我在用@WebMvcTest
(例如这个)装饰的测试类时遇到了麻烦。这些应该只测试一个 Controller 类本身,使用各种 Bean 和其他依赖项的模拟对象。
- 自从实施上述配置后,他们首先开始崩溃,并出现
UnsatisfiedDependencyException
...“没有可用的 'javax.sql.DataSource' 类型的合格 bean”。 - 然后我将这些行添加到每个这样的测试用例中:
@MockBean
private DataSource dataSource;
- 第一个异常似乎消失了,但现在我的日志中出现以下错误:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection: DataSource returned null from getConnection(): javax.sql.DataSource#0 bean
这些测试@WithMockUser
在一些地方使用了注解,并且预计不会使用真正的数据库或 JDBC 连接,因为它们每个都只是测试一个控制器。
我的问题:如何在没有测试类失败的情况下将@WebMvcTest 与我当前的安全配置一起使用?我应该在测试类中添加一个方便的 Spring Boot 注释吗?我做错了安全配置吗?
解决方案
使测试工作的解决方案是将此属性添加到我的application.yaml
:
spring:
datasource:
initialization-mode: always
或者,如果您更喜欢使用application.properties
配置文件,它看起来像这样:
spring.datasource.initialization-mode=always
我感谢用户Japan Trivedi,他在我的相关问题上指出了这一点。
推荐阅读
- c# - C# Task.Delay(1).Wait() 死锁,但前提是在另一个任务中
- ios - App Store Connect 中的可本地化信息在发布后重置
- html - 如何将由代码创建的 html 表转换为 json 对象?AngularJS
- python - 如何使用 OpenCV 改进图像对齐
- angular - 角度构造函数中的复杂位置很难测试
- reactjs - BrowserRouter的componentWillUnmount问题
- laravel - 我如何在数据函数中获取路由参数以及延迟加载组件
- html - 调整右侧屏幕大小时如何删除多余的空间?
- class - 使用类作为电话簿字典
- python - 无法以编程方式登录网站