Java如何检测测试方法是否携带指定注解并按需执行对应逻辑
TestNG场景下按方法注解触发前置逻辑实现
你代码里用的是TestNG的@BeforeTest/@Test注解,直接按下面步骤实现即可:
核心注意点
- 自定义的
@SomeAnnotation必须配置运行时保留策略,否则执行阶段通过反射拿不到注解标记 - 不要用
@BeforeTest做判断:这个注解是TestNG测试套件维度的前置钩子,整个<test>标签执行周期只会跑1次,无法感知每个独立测试方法的信息。单方法维度的前置判断要用@BeforeMethod,该注解修饰的方法会在每个@Test方法执行前触发,TestNG会自动注入当前执行方法的反射对象供你判断。
代码实现
1. 定义自定义注解(如果还没定义的话)
import java.lang.annotation.*; // 必须加运行时保留策略,否则反射无法读取 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) // 限定注解只能加在方法上 public @interface SomeAnnotation { // 如果注解需要传参,在这里定义属性即可 }
2. 修改BaseTest中的前置逻辑
import org.testng.annotations.BeforeMethod; import java.lang.reflect.Method; public class BaseTest { @BeforeMethod public void checkAnnotationAndRun(Method currentTestMethod) { // 判断当前执行的方法是否标记了指定注解 if (currentTestMethod.isAnnotationPresent(SomeAnnotation.class)) { foo(); } // 无注解直接跳过,不做任何操作 } private void foo() { // 这里写你需要执行的foo()逻辑 } }
3. 测试子类无需额外修改
所有继承BaseTest的测试类保持原有写法即可,比如你给出的TestCase类不需要加任何额外代码:
import org.testng.annotations.Test; public class TestCase extends BaseTest { @Test public void test1() { // 业务测试逻辑,无注解,不会触发foo() } @SomeAnnotation @Test public void test2() { // 业务测试逻辑,带注解,执行前会触发foo() } // 其他测试方法... @SomeAnnotation @Test public void test7() { // 业务测试逻辑,带注解,执行前会触发foo() } }
扩展说明
- 该实现对所有继承BaseTest的测试类全局生效,不需要每个子类重复写判断逻辑
- 如果需要获取
@SomeAnnotation里的配置参数,直接调用currentTestMethod.getAnnotation(SomeAnnotation.class)拿到注解实例,读取对应属性值即可 - 如果你用的是JUnit5而非TestNG,逻辑完全一致,只需要把
@BeforeMethod替换成JUnit5的@BeforeEach注解即可,同样支持注入Method参数。
内容的提问来源于stack exchange,提问作者Zzz...
相关产品推荐
相关产品推荐

