尝试在页面对象中使用静态方法时,我遇到了NullPointerExceptions的麻烦。如果我使用非静态方法进行操作,则效果很好。
非静态版本:
public class ComplaintPage {
private ExtendedWebDriver driver;
@FindBy(css = "[data-selector=date-received-complaint]")
public WebElement dateComplaintReceoved;
public ComplaintPage() {
driver = Browser.extendedDriver();
PageFactory.initElements(driver, this);
}
public void setComplaintDate() {
dateComplaintReceoved.sendKeys(LocalDate.now().toString());
}
}
Calling code:
ComplaintPage complaintPage = new ComplaintPage;
complaintPage.setComplaintDate();
这很好。日期字段已设置。
静态版
public class ComplaintPage {
private static ExtendedWebDriver driver;
@FindBy(css = "[data-selector=date-received-complaint]")
public static WebElement dateComplaintReceoved;
public ComplaintPage() {
driver = Browser.extendedDriver();
PageFactory.initElements(driver, this);
}
public void static setComplaintDate() {
* dateComplaintReceoved.sendKeys(LocalDate.now().toString());
}
}
Calling code:
ComplaintPage.setComplaintDate();
这不起作用,并在标有“ *”的行(访问WebElement的行)上导致java.lang.NullPointerException。
我有点喜欢在测试中使用像这样的静态方法,因为我并没有真正看到它的问题,它使代码更易于阅读。我以前在C#/
VS中做到了,但是由于某种原因,我在这里错过了一些重要的东西。
NullPointerException
因PageFactory
工作原理而被抛出。您会看到,当创建ComplaintPage
类的实例时,您正在调用其构造函数:
public ComplaintPage() {
driver = Browser.extendedDriver();
PageFactory.initElements(driver, this);
}
构造函数调用类的initElements
方法PageFactory
。此方法使用Java Reflection API
初始化所有WebElement
and
List<WebElement
>字段。基本上,它将默认null
值更改为接口的实现。它还提供了WebElement的惰性实例化,这意味着-
WebElement
仅在需要时-调用它们上的操作时才查找(寻找?)。
创建静态方法和静态WebElements时-您未调用类的构造函数,这导致未调用该initElements
方法。
带有注释的所有元素@FindBy
均未初始化。这就是为什么将PageFactory与静态方法一起使用不是一个好主意的原因。
除了使用PageFactory,您还可以driver.findElement
在static方法中找到具有classic的元素。
public void static setComplaintDate(WebDriver driver) {
driver.findElement(By.cssSelector("[data-selector=date-received-complaint]")).sendKeys(LocalDate.now().toString());
}
问题内容: 我正在寻找测试以下静态方法(特别是使用Doctrine模型)的最佳方法: 理想情况下,我将使用模拟对象来确保调用了“ fromArray”(具有提供的用户数据)和“ save”,但这是不可能的,因为该方法是静态的。 有什么建议么? 问题答案: PHPUnit的作者Sebastian Bergmann最近发表了一篇有关Stubbing和Mocking静态方法的博客文章。使用PHPUnit
本文向大家介绍php面向对象中static静态属性和静态方法的调用,包括了php面向对象中static静态属性和静态方法的调用的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php中static静态属性和静态方法的调用。分享给大家供大家参考。具体如下: 这里分析了php面向对象中static静态属性和静态方法的调用。关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置
问题内容: 这些对象调用之间有什么区别? 非静态: 静态的: 而且在内部为什么还要对函数使用static属性? 例: 问题答案: 静态函数,根据定义,不能也不依赖于该类的任何实例属性。也就是说,它们不需要类的实例来执行(因此,可以如您所显示的那样执行,而无需先创建实例)。从某种意义上讲,这意味着该函数不必(也永远不需要)依赖于类的成员或方法(公共或私有)。
我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式
问题内容: 我知道不可能在一个类中重写一个方法。但是,有没有办法使用非静态方法作为静态方法呢?例如,我有一个加数字的方法。我希望此方法在没有对象的情况下有用。是否可以在不创建其他方法的情况下执行类似的操作? 编辑:我的意思是,如果我将一个方法设为静态,我将需要它接受参数,如果我创建了一个已经设置了变量的对象,那么再次对具有相同参数的对象调用函数将非常不舒服。 我知道代码不正确,但是我想展示自己想做
问题内容: 如下所示,有两种简单的方法可以制作流式复印机(介绍Apache Commons或类似工具的栏)。我应该去哪一个?为什么? 与 问题答案: 我将使用非静态(实例)版本,并将其作为显式依赖项(使用setter)提供给消费者: 然后将其模拟用于单元测试是微不足道的,因此,消费者的测试不会与实现耦合。 换出功能很简单,例如:使用子类; 与依赖项注入系统配合良好。 编辑 为了回应(“有用!”)的