如何将动态值传递给自定义批注以从Java data.properties进行映射

时间:2019-03-29 18:23:39

标签: java annotations testng selenium-chromedriver

Im使用提供带有字符串的自定义注释的工具来实现Selenium / TestNG和Im的自动化测试。 我试图从data.properties中传递动态值,但尝试了不同的方法,但不断收到此错误: 批注值必须为常量表达式

public class MapData {

       // fetch value from data.properties and store it as string   
      public static final String TESTNAME = LoadProps.INSTANCE.loadProps().getProperty("TestName1");
      public static final String ABC = "ABC";

}

这是我的测试样本:

@Custom(name = "login")
@Test(priority = 1)
public void login() throws InterruptedException, IOException {...}

注释

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value={METHOD})
public abstract @interface Custom extends java.lang.annotation.Annotation 
{

    public abstract java.lang.String name();

}

我试图传递从data.properties中读取的动态值,如下所示:

@Custom(name = MapData.TESTNAME)

但是我遇到了运行时错误 如果您查看我的MapData类,我还有另一个字符串作为ABC,我直接存储了一个字符串。当我使用这种传递方式时:

@Custom(name = MapData.ABC)

很好,我没有任何错误!有什么区别?两种方式都传递字符串。 有什么方法可以从data.properties中获取数据并将其传递给注释?

1 个答案:

答案 0 :(得分:0)

使用注释时,不能将动态值分配给注释参数。但是,由于这是您的自定义注释,因此在处理注释时可以处理值。例如:

 String tValue = custom.name();
 String value = data.getProperty(tValue,tValue);

另一种方法是,您可以尝试使用QAF-TestNG extension具有meta-data的支持,您可以在其中使用以下参数:

@Test(description="This is example scenario in BDD",groups={"grp1","grp2"})
@MetaData("{'env':'${target.env}','TestID':'12345'}"
public void example(){

}
在上面的示例中,

${target.env}property,它将在运行时得到解析。 您可以按以下方式访问元数据:

ITestNGMethod testMethod = testResult.getMethod()
TestNGScenario scenario = (TestNGScenario) testMethod;  
Map<String, Object> metadata = scenario.getMetaData();