TestNg中的静态和非静态

时间:2018-05-18 05:43:13

标签: selenium selenium-webdriver testng

我有senario,我想了解在TestNG中使用访问修饰符静态和非静态。这是实际的代码`

public class BaseClass {

    public  WebDriver driver =null;
    public File f = null;
    public FileInputStream fs = null;
    public static Properties config = null;
    private final String configPath="C:\\Users\\prakumak\\eclipse-workspace\\WebDriverTestNGDDFramwork\\src\\MangoHCM\\Config.properties";

    @BeforeClass
    public  void setup() throws Exception {

        f = new File(configPath);
        try {
        fs = new FileInputStream(f);
        config = new Properties();
        config.load(fs);
        }catch(FileNotFoundException e) {
            System.out.println(" File is not present");
        }catch(IOException e) {
            System.out.println("File not loaded");
        }

        if(config.getProperty("BrowserName").equalsIgnoreCase("Firefox")) {
            driver = new FirefoxDriver();
        }else if(config.getProperty("BrowserName").equalsIgnoreCase("Chrome")) {
            driver = new ChromeDriver();
        }else {
            throw new Exception("BrowserName is either not mentione OR not correct");
        }

    }

场景1:当我将Properties变量STATIC和setup()方法设置为NON static时,我仍然可以直接在非静态setup()方法中调用Properties变量。怎么可能在非静态方法中使用静态变量?

方案2:当我将Setup()方法设为STATIC而Properties变量为非静态时,我收到的错误是“annot对非静态字段进行静态引用”。这对我来说没问题。 请帮我静态TestNG中的静态和非静态工作方式如何?它与Java的常规概念相同或者有什么不同吗?在testNG中的任何menthod中添加注释会使其静态吗?

1 个答案:

答案 0 :(得分:2)

静态和非静态的概念在Java和TestNG中是相同的。

非静态总是需要一个由此引用的上下文。静态不需要上下文,但您可以使用类名。如果您的代码在该类(即BaseClass.config)中,则不需要使用类名。同样的规则适用于方法(即代码中的BaseClass.setup(),除非将setup声明为static)。

如果你添加一个用@Before注释的非静态setup()方法,你将有两个方法,一个需要上下文,另一个不需要。为了使您的代码更具可读性,我建议您将静态setup()方法重命名为setupClass()

由于您的方法是使用@BeforeClass注释的,因此它必须是静态的。它与类绑定,而不是与上下文绑定。 @BeforeClass隐含地要求这样做。

  • @BeforeClass需要静态方法
  • @Before需要非静态方法

您始终可以从需要上下文的方法中访问不需要上下文的字段和方法。请记住,没有上下文的字段由静态和非静态方法共享,甚至在具有不同上下文的不同非静态方法之间共享。

基本规则是为字段和方法坚持使用相同的修饰符(非静态或静态)。