|
如需获取最新稳定版本,请使用 Spring Boot 4.0.4! |
测试
Spring Boot 包含了许多测试工具和支持类,以及一个提供常用测试依赖的专用Starters。 本节回答了有关测试的常见问题。
使用 Spring Security 进行测试
Spring Security 支持以特定用户身份运行测试。
例如,以下代码片段中的测试将以具有 ADMIN 角色的已认证用户身份运行。
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.assertj.MockMvcTester;
import static org.assertj.core.api.Assertions.assertThat;
@WebMvcTest(UserController.class)
class MySecurityTests {
@Autowired
private MockMvcTester mvc;
@Test
@WithMockUser(roles = "ADMIN")
void requestProtectedUrlWithUser() {
assertThat(this.mvc.get().uri("/")).doesNotHaveFailed();
}
}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.security.test.context.support.WithMockUser
import org.springframework.test.web.servlet.assertj.MockMvcTester
@WebMvcTest(UserController::class)
class MySecurityTests(@Autowired val mvc: MockMvcTester) {
@Test
@WithMockUser(roles = ["ADMIN"])
fun requestProtectedUrlWithUser() {
assertThat(mvc.get().uri("/"))
.doesNotHaveFailed()
}
}
Spring Security 提供了与 Spring MVC Test 的全面集成,这也可以在使用 @WebMvcTest 切片和 MockMvc 测试控制器时使用。
有关 Spring Security 测试支持的更多详细信息,请参阅 Spring Security 的 参考文档。
结构 @Configuration 用于包含在切片测试中的类
切片测试通过根据类型将 Spring Framework 的组件扫描限制为一组有限的组件来工作。
对于任何不是通过组件扫描创建的 bean,例如使用 @Bean 注解创建的 bean,切片测试将无法从应用程序上下文中包含/排除它们。
请看以下示例:
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration(proxyBeanMethods = false)
public class MyConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated());
return http.build();
}
@Bean
@ConfigurationProperties("app.datasource.second")
public HikariDataSource secondDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
}
对于一个具有上述 @Configuration 类的应用程序的 @WebMvcTest,您可能期望在应用上下文中拥有 SecurityFilterChain bean,以便可以测试控制器端点是否得到了正确的保护。
然而,MyConfiguration 并未被 @WebMvcTest 的组件扫描过滤器选中,因为它与过滤器指定的任何类型都不匹配。
您可以通过使用 @Import(MyConfiguration.class) 注解测试类来显式地包含该配置。
这将加载 MyConfiguration 中的所有 bean,包括测试 Web 层时不需要的 HikariDataSource bean。
将配置类拆分为两个类,就可以仅导入安全配置。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated());
return http.build();
}
}
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyDatasourceConfiguration {
@Bean
@ConfigurationProperties("app.datasource.second")
public HikariDataSource secondDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
}
当某个领域的 Bean 需要包含在切片测试中时,使用单一的配置类可能会效率低下。 相反,将应用程序的配置结构化为多个细粒度的类,每个类包含特定领域的 Bean,这样就可以仅在特定的切片测试中导入所需的配置类。
降级 Testcontainers Docker API 版本
Docker Desktop 的较新版本不支持 Spring Boot 所管理的 Testcontainers 依赖项使用的默认 API 版本。
为了帮助防止出现问题,Spring Boot 在 spring-boot-testcontainers 和 spring-boot-test jar 中提供了 docker-java.properties 个文件,用于升级 Testcontainers 使用的 API 版本。
如果您不希望更改 API 版本,您应该在项目的类路径中添加一个 docker-java.properties 文件。
空文件将恢复默认行为,或者您可以将 api.version 属性设置为您喜欢的任何值。