基础配置注解详解
本章深入讲解 Spring Test 中用于环境配置的核心注解,涵盖 上下文加载、属性覆盖、Profile 控制 等场景,提供代码示例和最佳实践。
1. @ExtendWith(SpringExtension.class)
作用
- 启用 Spring Test 支持:将 Spring 的依赖注入、上下文管理等功能与 JUnit 5 集成。
- 替代 JUnit 4 的
@RunWith(SpringRunner.class)
。
示例
@ExtendWith(SpringExtension.class) // 必须添加
public class BaseTest {
// ...
}
注意事项
- 所有 Spring 集成测试类必须添加此注解。
- 若忘记添加,将无法注入 Bean 或使用 Spring 的测试功能。
2. @ContextConfiguration
作用
- 指定 Spring 配置来源:定义测试类所需的配置文件(XML)或配置类(Java Config)。
常用属性
属性 | 作用 | 示例值 |
---|---|---|
classes | 指定 Java 配置类 | classes = AppConfig.class |
locations | 指定 XML 配置文件路径 | locations = "classpath:app-context.xml" |
loader | 自定义上下文加载器(高级用法) | loader = CustomContextLoader.class |
示例
// 加载 Java 配置类
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {DatabaseConfig.class, ServiceConfig.class})
public class JavaConfigTest { ... }
// 加载 XML 配置
@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class XmlConfigTest { ... }
// 混合加载
@ContextConfiguration(
classes = ServiceConfig.class,
locations = "classpath:dao-config.xml"
)
注意事项
- 若未指定
classes
或locations
,默认尝试加载测试类所在包的@Configuration
类。 - 多配置按顺序加载,后加载的配置可能覆盖先加载的 Bean。
3. @TestPropertySource
作用
- 覆盖或添加测试专用属性:优先级高于
application.properties
或 XML 中的属性。 - 常用于测试环境切换数据库、禁用外部服务调用等场景。
常用属性
属性 | 作用 |
---|---|
locations | 加载外部属性文件(如 classpath:test.properties ) |
properties | 直接定义键值对属性 |
示例
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = AppConfig.class)
@TestPropertySource(
locations = "classpath:test.properties",
properties = {
"app.timeout=2000",
"logging.level.root=WARN"
}
)
public class PropertyTest {
@Value("${app.timeout}")
private int timeout;
@Test
void testProperty() {
assertEquals(2000, timeout);
}
}
注意事项
- 属性文件的优先级顺序:
properties
>locations
> 主配置文件。 - 若属性未定义,测试将抛出
IllegalArgumentException
。
4. @ActiveProfiles
作用
- 激活指定的 Profile:使测试类仅加载特定 Profile 的配置(如
"test"
)。 - 常用于隔离测试环境与生产环境。
示例
步骤 1:定义 Profile 专属配置
@Configuration
@Profile("test")
public class TestConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.build();
}
}
步骤 2:测试类激活 Profile
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {AppConfig.class, TestConfig.class})
@ActiveProfiles("test") // 激活 Profile
public class ProfileTest {
@Autowired
private DataSource dataSource;
@Test
void testDataSource() {
assertTrue(dataSource instanceof EmbeddedDatabase);
}
}
注意事项
- 可同时激活多个 Profile:
@ActiveProfiles({"test", "dev"})
。 - 确保被激活的 Profile 对应的配置类已正确定义。
5. @TestConfiguration
作用
- 定义测试专用的配置类:覆盖主配置中的特定 Bean,不影响生产代码。
- 通常用于模拟外部依赖或简化测试环境。
示例
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {AppConfig.class, MockConfig.class})
public class MockTest {
@Autowired
private ExternalService externalService;
@Test
void testMock() {
assertTrue(externalService instanceof MockExternalService);
}
@TestConfiguration
static class MockConfig {
@Bean
public ExternalService externalService() {
return new MockExternalService(); // 覆盖原有 Bean
}
}
}
注意事项
@TestConfiguration
类通常作为测试类的静态内部类。- 需在主配置中通过
@Import
显式导入,或在@ContextConfiguration
中引用。
6. @Import
作用
- 导入额外的配置类:补充主配置中未包含的 Bean。
- 适用于模块化配置的场景。
示例
@Configuration
@Import(DaoConfig.class) // 导入其他配置类
public class AppConfig { ... }
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = AppConfig.class)
public class ImportTest {
@Autowired
private UserDao userDao; // 来自 DaoConfig
}
注意事项
- 与
@ContextConfiguration
的classes
属性功能类似,但更适用于分层配置。
总结
通过合理使用基础配置注解,可以精准控制测试环境:
- 加载配置:
@ContextConfiguration
定义上下文来源。 - 覆盖属性:
@TestPropertySource
动态调整参数。 - 环境隔离:
@ActiveProfiles
切换测试 Profile。 - 灵活扩展:
@TestConfiguration
和@Import
补充或覆盖 Bean。
掌握这些注解后,能够快速构建稳定、可复用的测试环境。