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 屬性進行指定。
此外,@WebAppConfiguration 的 value 屬性現在應使用 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 註解。