知識庫 / Spring / Spring Boot RSS 訂閱

排除 Spring Boot 測試中的自動配置類

Spring Boot,Testing
HongKong
4
01:33 PM · Dec 06 ,2025

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.SecurityAutoConfiguration

6. 使用自定義測試配置

最後,我們可以使用單獨的配置應用程序來運行我們的測試

@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 測試中排除自動配置類的一些方法。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.