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 不支持 @ContextConfigurationloader 属性。若需自定义加载器,只能回退到基础注解组合:

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

好消息:从 Spring 6 和 Spring Boot 3.2.0 开始,@SpringJUnitConfig 新增了 loader 参数,支持配置自定义 ContextLoaderSmartContextLoader

示例:直接通过注解指定基于注解的加载器:

@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 属性指定
  • @WebAppConfigurationvalue 属性需改用 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 仓库 中查看。