1. 概述
在本快速教程中,我們將討論如何從 Spring Boot 測試中排除自動配置類
Spring Boot 的自動配置功能非常實用,因為它為我們處理了大量的設置。但是,這在測試過程中也可能成為問題,如果我們不想讓某個自動配置干擾我們對模塊的測試。
常見的例子是安全自動配置,我們將在此示例中使用它。
2. 測試示例
首先,我們將查看我們的測試示例。
我們將擁有一個安全的 Spring Boot 應用程序,幷包含一個簡單的首頁。
當我們嘗試在沒有身份驗證的情況下訪問首頁時,響應是“401 UNAUTHORIZED”。
讓我們在用 REST-assured 執行測試中查看這一點:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
public class AutoConfigIntegrationTest {
@Test
public void givenNoAuthentication_whenAccessHome_thenUnauthorized() {
int statusCode = RestAssured.get("http://localhost:8080/").statusCode();
assertEquals(HttpStatus.UNAUTHORIZED.value(), statusCode);
}
}另一方面,通過身份驗證,我們可以成功訪問主頁:
@Test
public void givenAuthentication_whenAccessHome_thenOK() {
int statusCode = RestAssured.given().auth().basic("john", "123")
.get("http://localhost:8080/")
.statusCode();
assertEquals(HttpStatus.OK.value(), statusCode);
}在下面的部分中,我們將嘗試不同的方法來從測試配置中排除 SecurityAutoConfiguration 類。
3. 使用@EnableAutoConfiguration 註解
有多種方法可以從測試配置中排除特定的自動配置類。
首先,讓我們看看如何使用@EnableAutoConfiguration 註解,並指定exclude 參數:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
@EnableAutoConfiguration(exclude=SecurityAutoConfiguration.class)
public class ExcludeAutoConfigIntegrationTest {
@Test
public void givenSecurityConfigExcluded_whenAccessHome_thenNoAuthenticationRequired() {
int statusCode = RestAssured.get("http://localhost:8080/").statusCode();
assertEquals(HttpStatus.OK.value(), statusCode);
}
}在本示例中,我們通過使用 SecurityAutoConfiguration 類及其 exclude 屬性,已排除該類。但同樣的方法也可以應用於任何 自動配置類。
現在,我們可以運行測試,該測試訪問主頁而不進行身份驗證,並且它將不再失敗。
4. 使用 @TestPropertySource
接下來,我們可以使用 @TestPropertySource 注入 “spring.autoconfigure.exclude” 屬性:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
@TestPropertySource(properties =
"spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration")
public class ExcludeAutoConfigIntegrationTest {
// ...
}需要注意的是,為了指定屬性,必須提供完整的類名(包名+簡單名稱)。
5. 使用配置文件
我們也可以使用配置文件來設置測試中的 "spring.autoconfigure.exclude" 屬性:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
public class ExcludeAutoConfigIntegrationTest {
// ...
}包括所有“test” 配置文件特定的屬性在 application-test.properties 中:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration6. 使用自定義測試配置
最後,我們可以使用單獨的配置應用程序來運行我們的測試:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class, webEnvironment = WebEnvironment.DEFINED_PORT)
public class ExcludeAutoConfigIntegrationTest {
// ...
}從 @SpringBootApplication(exclude={CLASS_NAME}) 中排除自動配置類:
@SpringBootApplication(exclude=SecurityAutoConfiguration.class)
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}7. 結論
在本文中,我們探討了在 Spring Boot 測試中排除自動配置類的一些方法。