我可以管理@DataProvider在@BeforeMethod之后运行

时间:2017-03-17 14:42:14

标签: java testng

在我的@Test方法之上,我有一个注释,其中包含@DataProvider应从中提取数据的文件名。我尝试在@BeforeMethod中初始化该文件,但我没有成功,因为@BeforeMethod运行 AFTER @DataProvider。

我需要在@BeforeMethod中初始化File的原因是我只能通过该方法知道运行了哪个@Test方法,然后使用文件名拉取其注释。另外,我希望在每个@Test方法运行之前执行此操作。我怎么能让这件事有效?

String fileName;

@MyAnnotation(fileName="abc.txt")
@Test(dataProvider = "getData")
public void test(DataFromFile data) {
    ...showData();
}

@BeforeMethod
public void beforeMethod(Method invokingMethod) {
    fileName ... = invokingMethod.getAnnotation(MyAnnotation.class).fileName();
}

@DataProvider
public Object[][] getData() { 
    ... initialize new File(fileName);
    ... 
}

1 个答案:

答案 0 :(得分:1)

你应该做这样的事情

package com.rationaleemotions.stackoverflow;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

import static java.lang.annotation.ElementType.METHOD;

public class DataProviderGames {
    @Test(dataProvider = "getData")
    @MyAnnotation(fileName = "input.txt")
    public void test(String data) {
        System.err.println("Test data :" + data);
    }

    @Test(dataProvider = "getData")
    @MyAnnotation(fileName = "input.csv")
    public void anotherTest(String data) {
        System.err.println("Test data :" + data);
    }

    @DataProvider
    public Object[][] getData(Method method) {
        MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
        return new Object[][]{
                {annotation.fileName()}
        };
    }

    @Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
    @Target({METHOD})
    @interface MyAnnotation {
        String fileName() default "";
    }
}

由于TestNG为您提供了注入调用@DataProvider注释方法的实际“方法”,因此您应该可以直接使用反射来查询方法参数用于注释并通过它检索文件名。