1. 简介
本文快速介绍 Spring 5 及以上版本中新增的 @SpringJUnitConfig
和 @SpringJUnitWebConfig
注解。
这两个注解本质上是 JUnit 5 和 Spring 注解的组合体,能显著简化测试代码的编写过程,提升开发效率。
2. @SpringJUnitConfig
@SpringJUnitConfig
整合了以下两个核心注解:
- ✅ **JUnit 5 的
@ExtendWith(SpringExtension.class)
**:启用 Spring 测试扩展 - ✅ **Spring 测试的
@ContextConfiguration
**:加载 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);
}
下面是 @SpringJUnitConfig(SpringJUnitConfigTest.Config.class)
的等价写法:
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = SpringJUnitConfigTest.Config.class)
2.2. loader 属性
最初 @SpringJUnitConfig
不支持 @ContextConfiguration
的 loader
属性。若需自定义加载器,只能回退到基础注解组合:
@ExtendWith(SpringExtension.class)
@ContextConfiguration(loader = SpringConfigTest.class)
✅ 好消息:从 Spring 6 和 Spring Boot 3.2.0 开始,@SpringJUnitConfig
新增了 loader
参数,支持配置自定义 ContextLoader
或 SmartContextLoader
。
示例:直接通过注解指定基于注解的加载器:
@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
基础上增加了 @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);
}
等价的传统写法:
@ExtendWith(SpringExtension.class)
@WebAppConfiguration
@ContextConfiguration(classes = SpringJUnitWebConfigIntegrationTest.Config.class)
✅ 同样地,Spring 6 和 Spring Boot 3.2.0 为 @SpringJUnitWebConfig
新增了 loader
支持,使其具备与 @ContextConfiguration
同等的能力。
4. 总结
本文展示了在 Spring 5 及更高版本中使用 @SpringJUnitConfig
和 @SpringJUnitWebConfig
注解的实践方法。这些组合注解能显著简化测试配置,减少样板代码。
完整示例代码可在 GitHub 仓库 中查看。