Spring Boot测试自定义注解是否可覆盖内部嵌套注解的参数值
问题解答
结论
你提出的需求完全可以实现,Spring框架原生支持元注解属性覆盖能力,通过@AliasFor注解即可完成自定义注解参数到元注解参数的透传、覆盖。
实现方案
第一步:编写自定义@IntegrationTest注解完整代码
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.core.annotation.AliasFor; import org.springframework.test.context.ActiveProfiles; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @SpringBootTest @ComponentScan @ActiveProfiles("testing") public @interface IntegrationTest { // 透传参数到@SpringBootTest的classes属性 @AliasFor(annotation = SpringBootTest.class, attribute = "classes") Class<?>[] classes() default {}; // 透传参数到@ComponentScan的basePackages属性 @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] basePackages() default {}; // 可选:如果需要支持覆盖测试环境profile,也可以加对应别名 @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] profiles() default "testing"; }
第二步:按你期望的方式使用注解
// 直接传入参数即可覆盖对应元注解的默认配置 @IntegrationTest( classes = {DemoConfig.class, TestService.class}, basePackages = "com.yourcompany.business" ) class AbcTest { // 编写测试逻辑即可 }
补充说明
- 你可以根据需要给属性设置默认值,比如希望默认扫描固定包的话,可以把
basePackages()的默认值改成{"com.yourcompany.common"},不传参数时就会自动用默认配置 - 该特性是Spring 4.0+原生提供的能力,所有Spring Boot 2.x及以上版本都可以直接使用,无需引入额外依赖
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

