有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何将动态值传递给自定义注释,以从Java数据进行映射。性质

Im使用Selenium/TestNG和Im实现了一个自动化测试,并使用了一个工具,该工具提供了接受字符串的自定义注释。 我试图从数据中传递动态值。属性,我尝试了不同的方法,但我经常遇到这样的错误: 注释值必须是常量表达式

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();

}

我试图传递从数据中读取的动态值。类似这样的属性:

@Custom(name = MapData.TESTNAME)

但我犯了运行时错误 如果你看我的MapData类,我有另一个字符串作为ABC,我直接存储了一个字符串。当我以这种方式通过时:

@Custom(name = MapData.ABC)

很好,我没有任何错误!有什么区别?两个方向都在传递字符串。 有没有办法从数据中提取数据。属性并将其传递给注释


共 (1) 个答案

  1. # 1 楼答案

    使用注释时,不能将动态值指定给注释参数。然而,由于它是您的自定义注释,所以在处理注释时,您可以处理值。例如:

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

    另一种方法是,您可以尝试使用QAF-TestNG extensionhas 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();