TestNG中Static与Non Static的使用疑问及原理咨询
解答TestNG中Static与Non-Static访问修饰符的使用疑问
先贴一下你的代码方便参考:
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 mentioned OR not correct"); } } }
场景1:非静态setup()能直接调用静态config变量的原因
这和TestNG一点关系都没有,就是Java的基础语法规则:
- 静态成员(变量/方法)是属于类本身的,只要类被加载到JVM中,静态成员就存在于内存里,不需要创建类的实例。
- 非静态方法是属于类的实例的,而实例是由类创建出来的,所以实例的方法自然可以访问类级别的静态成员。
- 你代码里的
config其实等价于BaseClass.config,编译器会自动帮你补上类名,所以非静态方法能直接调用它。
场景2:静态方法无法引用非静态变量(已知问题)
这个同样是Java的规则:
静态方法属于类,它执行的时候可能还没有任何类的实例被创建,而非静态变量是绑定到具体实例的,没有实例就找不到对应的非静态变量,所以编译器会抛出cannot make a static reference to the non-static field错误,TestNG在这里完全遵循Java的规则。
核心疑问:TestNG的静态/非静态机制和Java常规一致吗?注解会让方法变静态吗?
两个问题的答案都是明确的:
- 完全一致:TestNG没有修改Java的静态/非静态基础规则,所有访问权限、调用逻辑都和普通Java代码一模一样。
- 注解不会让方法变静态:TestNG的注解(比如
@BeforeClass、@Test)只是标记方法的执行时机和作用,不会改变方法本身的静态/非静态属性。
举个实际执行的例子帮你理解:
- 当
setup()是非静态且加了@BeforeClass:TestNG会先创建BaseClass的一个实例,然后调用这个实例的setup()方法,这时候方法里的非静态成员(比如driver)属于当前实例,静态成员(config)属于BaseClass类,都能正常访问。 - 如果把
setup()改成静态的:TestNG会直接通过类名调用BaseClass.setup(),这时候方法里不能访问非静态成员(比如driver),因为没有实例存在——这就是场景2报错的根源。
总结来说:TestNG只是按照Java的规则去调用你标记了注解的方法,注解只是告诉TestNG什么时候调用、怎么调用,不会改变方法的静态特性,所有静态/非静态的访问规则都和普通Java代码完全一致。
内容的提问来源于stack exchange,提问作者user9134826
相关产品推荐
相关产品推荐

