2.2 基础配置注解详解


基础配置注解详解

本章深入讲解 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"  
)  

注意事项

  • 若未指定 classeslocations,默认尝试加载测试类所在包的 @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  
}  

注意事项

  • @ContextConfigurationclasses 属性功能类似,但更适用于分层配置。

总结

通过合理使用基础配置注解,可以精准控制测试环境:

  1. 加载配置@ContextConfiguration 定义上下文来源。
  2. 覆盖属性@TestPropertySource 动态调整参数。
  3. 环境隔离@ActiveProfiles 切换测试 Profile。
  4. 灵活扩展@TestConfiguration@Import 补充或覆盖 Bean。

掌握这些注解后,能够快速构建稳定、可复用的测试环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值