知識庫 / Spring RSS 訂閱

Spring JUnit 配置註解:SpringJUnitConfig 和 SpringJUnitWebConfig

Spring,Testing
HongKong
5
02:12 PM · Dec 06 ,2025

1. 引言

在本文檔中,我們將探討 Spring 和 Spring Boot 中新引入的 @SpringJUnitConfig@SpringJUnitWebConfig 註解。

這些註解是 JUnit 5 和 Spring 註解的組合,旨在簡化和加速測試創建過程。

2. <em @SpringJUnitConfig@

結合了這兩個註解:

  • 從 JUnit 5 中引入,使用 類運行測試,
  • 從 Spring Testing 中引入,加載 Spring 上下文。

2.1. 測試配置

讓我們創建一個測試,並在實踐中應用此標註:

@SpringJUnitConfig(SpringJUnitConfigIntegrationTest.Config.class)
public class SpringJUnitConfigIntegrationTest {

    @Configuration
    static class Config {}
}

請注意,與 @ContextConfiguration 相比,配置類使用 value 屬性進行聲明。但是,資源位置應使用 locations 屬性指定。

現在我們可以驗證 Spring 上下文是否真的已加載:

@Autowired
private ApplicationContext applicationContext;

@Test
void givenAppContext_WhenInjected_ThenItShouldNotBeNull() {
    assertNotNull(applicationContext);
}
<p>最後,這裏是與 <em >@SpringJUnitConfig(SpringJUnitConfigTest.Config.class):</em ></p>
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = SpringJUnitConfigTest.Config.class)

2.2. <em>loader</em> 屬性

`@ContextConfiguration` 中名為 `loader` 的一個屬性,在最初發布時並非 `@SpringJUnitConfig` 中的屬性。當我們需要顯式設置自定義加載器時,必須回退到更底層的註解:

@ExtendWith(SpringExtension.class)
@ContextConfiguration(loader = SpringConfigTest.class)

Spring 6 及 Spring Boot 3.2.0 版本起,<em>loader</em> 屬性作為參數可在 <em>@SpringJUnitConfig</em> 註解中配置。這提供了配置自定義的 <em>ContextLoader</em><em>SmartContextLoader</em> 的支持。

例如,以下是如何在 <em>@SpringJUnitConfig</em> 註解中直接指定基於註解的加載:

@SpringJUnitConfig(classes = TestConfig.class, loader = AnnotationConfigContextLoader.class)
public class SpringJUnitConfigurationUnitTest {
    @ParameterizedTest
    @ValueSource(strings = { "Dilbert", "Wally" })
    void whenSetPeopleWithName_thenListContainsOnePerson(String name, @Autowired List people) {
        assertThat(people.stream()
          .map(Person::getName)
          .filter(name::equals)).hasSize(1);
    }
}

使用 loader 屬性,我們擁有一個更簡單的測試配置,無需使用多個註解。

3. @SpringJUnitWebConfig

@SpringJUnitWebConfig 結合了@SpringJUnitConfig 的相同註解,以及 Spring 測試中的 @WebAppConfiguration 註解 – 用於加載 WebApplicationContext

下面我們來看這個註解的工作方式:

@SpringJUnitWebConfig(SpringJUnitWebConfigIntegrationTest.Config.class)
public class SpringJUnitWebConfigIntegrationTest {

    @Configuration
    static class Config {
    }
}

類似於 @SpringJUnitConfig配置類應置於 value 屬性中,並且任何資源都使用 locations 屬性進行指定。

此外,@WebAppConfigurationvalue 屬性現在應使用 resourcePath 屬性進行指定。 默認情況下,此屬性設置為 “src/main/webapp”

現在讓我們驗證 WebApplicationContext 是否真的加載了:

@Autowired
private WebApplicationContext webAppContext;

@Test
void givenWebAppContext_WhenInjected_ThenItShouldNotBeNull() {
    assertNotNull(webAppContext);
}

再次,這裏我們展示了不使用 @SpringJUnitWebConfig 的等效代碼:

@ExtendWith(SpringExtension.class)
@WebAppConfiguration
@ContextConfiguration(classes = SpringJUnitWebConfigIntegrationTest.Config.class)

同樣,Spring 6 和 Spring Boot 3.2.0 版本增加了對 loader的支持,將其配置到 @SpringJUnitWebConfig 中,以便為測試配置自定義上下文加載器。 這使得該註解擁有與 @ContextConfiguration 註解相同的全部功能。

4. 結論

在本教程中,我們演示瞭如何在 Spring 5 及更高版本中使用 @SpringJUnitConfig@SpringJUnitWebConfig 註解。

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

發佈 評論

Some HTML is okay.