我有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中添加注释会使其静态吗?
答案 0 :(得分:2)
静态和非静态的概念在Java和TestNG中是相同的。
非静态总是需要一个由此引用的上下文。静态不需要上下文,但您可以使用类名。如果您的代码在该类(即BaseClass.config)中,则不需要使用类名。同样的规则适用于方法(即代码中的BaseClass.setup(),除非将setup声明为static)。
如果你添加一个用@Before注释的非静态setup()方法,你将有两个方法,一个需要上下文,另一个不需要。为了使您的代码更具可读性,我建议您将静态setup()方法重命名为setupClass()。
由于您的方法是使用@BeforeClass注释的,因此它必须是静态的。它与类绑定,而不是与上下文绑定。 @BeforeClass隐含地要求这样做。
您始终可以从需要上下文的方法中访问不需要上下文的字段和方法。请记住,没有上下文的字段由静态和非静态方法共享,甚至在具有不同上下文的不同非静态方法之间共享。
基本规则是为字段和方法坚持使用相同的修饰符(非静态或静态)。