測試

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.webmvc.test.autoconfigure.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.webmvc.test.autoconfigure.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) {
		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) {
		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 的細粒度類,可以使它們僅用於特定切片測試。

© . This site is unofficial and not affiliated with VMware.