此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
Spring Boot 包括许多测试实用程序和支持类,以及提供常见测试依赖项的专用启动器。 本部分回答有关测试的常见问题。
使用 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.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@WebMvcTest(UserController.class)
class MySecurityTests {
@Autowired
private MockMvc mvc;
@Test
@WithMockUser(roles = "ADMIN")
void requestProtectedUrlWithUser() throws Exception {
this.mvc.perform(get("/"));
}
}
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.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
@WebMvcTest(UserController::class)
class MySecurityTests(@Autowired val mvc: MockMvc) {
@Test
@WithMockUser(roles = ["ADMIN"])
fun requestProtectedUrlWithUser() {
mvc.perform(MockMvcRequestBuilders.get("/"))
}
}
Spring Security 提供了与 Spring MVC Test 的全面集成,这也可用于使用 slice 和 .@WebMvcTest
MockMvc
有关 Spring Security 测试支持的更多详细信息,请参阅 Spring Security 的参考文档。
用于包含在切片测试中的结构类@Configuration
切片测试的工作原理是将 Spring Framework 的组件扫描限制为一组有限的组件,具体取决于它们的类型。
对于任何不是通过组件扫描创建的 Bean,例如,使用注释创建的 Bean,切片测试将无法在应用程序上下文中包含/排除它们。
请看这个例子:@Bean
import org.apache.commons.dbcp2.BasicDataSource;
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 BasicDataSource secondDataSource() {
return DataSourceBuilder.create().type(BasicDataSource.class).build();
}
}
对于具有上述类的应用程序,您可能希望在应用程序上下文中具有 Bean,以便您可以测试控制器端点是否正确保护。
但是,@WebMvcTest的组件扫描筛选器不会选取,因为它与筛选器指定的任何类型都不匹配。
可以通过使用 对测试类进行批注来显式包含配置。
这将加载所有 Bean,包括 Bean,这在测试 Web 层时是不需要的。
将配置类拆分为两个将允许仅导入安全配置。@WebMvcTest
@Configuration
SecurityFilterChain
MyConfiguration
@Import(MyConfiguration.class)
MyConfiguration
BasicDataSource
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 org.apache.commons.dbcp2.BasicDataSource;
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 BasicDataSource secondDataSource() {
return DataSourceBuilder.create().type(BasicDataSource.class).build();
}
}
当需要将来自某个域的 Bean 包含在切片测试中时,使用单个配置类可能效率低下。 相反,将应用程序的配置结构为多个粒度类,其中包含特定域的 Bean,可以仅为特定切片测试导入它们。