Java 为什么在没有定义静态引用的情况下会出现非静态引用错误?
我不明白为什么这里的错误“非静态方法getLoginPage()不能从静态上下文引用”!?这里没有静电!看起来很琐碎,但我不确定我错过了什么 编辑: 我知道通过实例化TestFramework,我可以消除错误,但按照建议,我试图避免在单元测试中实例化对象,并在需要时将对象创建传递给我的框架。另一方面,使TestFramework中的getLoginPage()成为静态的,会在我的TestFramework类中创建一大堆类似的错误 类测试。java:Java 为什么在没有定义静态引用的情况下会出现非静态引用错误?,java,unit-testing,junit4,Java,Unit Testing,Junit4,我不明白为什么这里的错误“非静态方法getLoginPage()不能从静态上下文引用”!?这里没有静电!看起来很琐碎,但我不确定我错过了什么 编辑: 我知道通过实例化TestFramework,我可以消除错误,但按照建议,我试图避免在单元测试中实例化对象,并在需要时将对象创建传递给我的框架。另一方面,使TestFramework中的getLoginPage()成为静态的,会在我的TestFramework类中创建一大堆类似的错误 类测试。java: public class Tests { @
public class Tests {
@Test
public void User_Can_Login(){
String username = "Jake";
String password = "Jake";
TestFramework.getLoginPage().Login(username, password);
assertTrue(TestFramework.getLoginPage().CheckIfLoggedIn(username));
}
public class TestFramework {
private LoginPage loginPage;
public LoginPage getLoginPage() {
loginPage = new LoginPage();
PageFactory.initElements(Browser.getDriver(), loginPage);
return loginPage;
}
public class LoginPage {
String Url = "http://localhost:8080";
String welcomeMsg = "Welcome";
public void Login(String username, String password) {
Browser.Goto(Url);
Browser.Input(username,password);
Browser.Submit();
}
public boolean CheckIfLoggedIn(String user){
return Browser.getTextByxpath("/html/body/header/div/p").contains(welcomeMsg + " " + user);
}
}
类TestFramework.Java:
public class Tests {
@Test
public void User_Can_Login(){
String username = "Jake";
String password = "Jake";
TestFramework.getLoginPage().Login(username, password);
assertTrue(TestFramework.getLoginPage().CheckIfLoggedIn(username));
}
public class TestFramework {
private LoginPage loginPage;
public LoginPage getLoginPage() {
loginPage = new LoginPage();
PageFactory.initElements(Browser.getDriver(), loginPage);
return loginPage;
}
public class LoginPage {
String Url = "http://localhost:8080";
String welcomeMsg = "Welcome";
public void Login(String username, String password) {
Browser.Goto(Url);
Browser.Input(username,password);
Browser.Submit();
}
public boolean CheckIfLoggedIn(String user){
return Browser.getTextByxpath("/html/body/header/div/p").contains(welcomeMsg + " " + user);
}
}
在该行TestFramework
中没有一个实例和编译器将其假定为静态类型。创建TestFramework
的实例并调用该方法
你可能需要
TestFramework tfWork = new TestFramework();
tfwork.getLoginPage().Login(username, password);
assertTrue(tfWork.getLoginPage().CheckIfLoggedIn(username));
在该行TestFramework
中没有一个实例和编译器将其假定为静态类型。创建TestFramework
的实例并调用该方法
你可能需要
TestFramework tfWork = new TestFramework();
tfwork.getLoginPage().Login(username, password);
assertTrue(tfWork.getLoginPage().CheckIfLoggedIn(username));
TestFramework
如果不是一个静态上下文(它是一个类,而不是一个实例)。如果不是一个静态上下文(它是一个类,而不是一个实例),那么什么是TestFramework
。您试图使用类名而不是实例来调用该方法
TestFramework.getLoginPage().Login(username, password);
我宁愿这样做
new TestFramework().getLoginPage().Login(username, password);
您正在尝试使用类名而不是实例调用该方法
TestFramework.getLoginPage().Login(username, password);
我宁愿这样做
new TestFramework().getLoginPage().Login(username, password);
可能是因为您没有TestFramework的实例…
getLoginPage()
方法不是静态的。所以你不能像TestFramework.getLoginPage()
那样调用。您需要创建对象newtestframework().getLoginPage()
在旁注中,您可能希望参考Java命名约定,即方法名称以小写开头,没有下划线etc@JamesB没错!过了一会儿回到Java,我已经忘记了命名约定,感谢您的提醒可能是因为您没有TestFramework的实例…getLoginPage()
方法不是静态的。所以你不能像TestFramework.getLoginPage()
那样调用。您需要创建对象newtestframework().getLoginPage()
在旁注中,您可能希望参考Java命名约定,即方法名称以小写开头,没有下划线etc@JamesB没错!过了一段时间,我忘记了命名约定,再次回到Java,感谢您提醒我这似乎是事实,但我试图避免在测试类中实例化对象,因为这是不推荐的。这是否意味着我需要将框架中的所有内容都设置为静态,以便能够从单元测试调用它?@SabaAhang将所有内容设置为静态不是一个好主意。记住,静态方法中使用的变量和方法也是静态的。不要那样做。使用实例。似乎是这样,但我试图避免在我的测试类中实例化对象,因为这是不推荐的。这是否意味着我需要将框架中的所有内容都设置为静态,以便能够从单元测试调用它?@SabaAhang将所有内容设置为静态不是一个好主意。记住,静态方法中使用的变量和方法也是静态的。不要那样做。使用实例。