TestBase构造方法内加载的prop为何能在initialization()中调用getProperty
问题原因说明
你的误解本质是混淆了局部变量作用域和静态成员的对象生命周期两个概念,具体逻辑拆解如下:
- 首先看
prop的声明位置:它是定义在类下的static成员变量,不属于构造方法的局部变量,作用域覆盖整个类,生命周期和类本身一致,不会随着构造方法执行结束就被销毁。 - 你在
TestBase()构造方法里执行的prop.load(ip),本质是把配置文件的键值对读取后,写入prop这个静态对象的内部存储结构中。这个操作修改的是静态成员prop持有的数据,不是构造方法里的临时数据:只要prop没有被重新赋值、没有被回收,里面存的配置数据就会一直保留。 - 之所以
initialization()里调用prop.getProperty("browser")能正常工作,是因为你调用这个静态方法之前,必然已经触发过一次TestBase类的实例化(不管是你手动new对象,还是TestNG/JUnit这类测试框架自动实例化测试类),构造方法已经执行完成,配置内容早就加载到静态的prop对象里了,后续静态方法读取的就是已经存在的内存数据,自然能拿到正确值。
顺带提一句,这个写法本身存在隐患:如果跳过实例化步骤直接调用
initialization()静态方法,prop会处于未初始化的null状态,直接抛出空指针异常。更合理的写法是把配置加载逻辑也放到静态初始化块里,和静态方法的调用逻辑对齐,避免依赖构造方法的执行时机。
另外你贴的代码里还有几处明显的笔误,运行时会直接报错:
prop=new properties()应该是prop = new Properties(),Java类名遵循大驼峰命名规则e.printStackTruce()拼写错误,正确写法是e.printStackTrace()driver=new ForefoxDriver()拼写错误,正确写法是driver = new FirefoxDriver()- 驱动路径里的
/User/Christain/Dwonloads/拼写错误,正确路径应该是/Users/Christain/Downloads/
内容的提问来源于stack exchange,提问作者Jackie M
相关产品推荐
相关产品推荐

