在TestRule中访问自定义注释

时间:2016-11-18 10:10:04

标签: java spring junit annotations

序:

我有以下注释和junit测试的规则初始化部分。 目标是使用不同的配置并使测试尽可能简单易用。

// Annotation
@Retention(RetentionPolicy.RUNTIME)
public @interface ConnectionParams {
    public String username();
    public String password() default "";
}

// Part of the test
@ConnectionParams(username = "john")
@Rule
public ConnectionTestRule ctr1 = new ConnectionTestRule();

@ConnectionParams(username = "doe", password = "secret")
@Rule
public ConnectionTestRule ctr2 = new ConnectionTestRule();

现在我想访问以下TestRule中的注释参数,但它找不到任何注释。

public class ConnectionTestRule implements TestRule {
    public Statement apply(Statement arg0, Description arg1) {
        if (this.getClass().isAnnotationPresent(ConnectionParams.class)) {
            ... // do stuff
        }
    }
}

如何在TestRule中访问注释?

1 个答案:

答案 0 :(得分:0)

您的申请不正确。

在课程级别应用自定义注释,而不是按照您的方式应用。

// Apply on class instead
@ConnectionParams(username = "john")
public class ConnectionTestRule {....

然后你的代码应该可以工作,

public class ConnectionTestRule implements TestRule {
    public Statement apply(Statement arg0, Description arg1) {
      //get annotation from current (this) class
      if (this.getClass().isAnnotationPresent(ConnectionParams.class)) {
        ... // do stuff
      }
    }
}

编辑:更新后的问题。

您需要首先使用反射获取字段,以便找到您创建的每个ConnectionTestRule对象,并从中获取注释以获得所需的配置。

for(Field field : class_in_which_object_created.getDeclaredFields()){
      Class type = field.getType();
      String name = field.getName();
      //it will get annotations from each of your 
      //public ConnectionTestRule ctr1 = new ConnectionTestRule();
      //public ConnectionTestRule ctr2 = new ConnectionTestRule();
      Annotation[] annotations = field.getDeclaredAnnotations();
      /*
       *
       *once you get your @ConnectionParams then pass it respective tests
       *
       */
}