Java 为什么在没有定义静态引用的情况下会出现非静态引用错误?

Java 为什么在没有定义静态引用的情况下会出现非静态引用错误?,java,unit-testing,junit4,Java,Unit Testing,Junit4,我不明白为什么这里的错误“非静态方法getLoginPage()不能从静态上下文引用”!?这里没有静电!看起来很琐碎,但我不确定我错过了什么 编辑: 我知道通过实例化TestFramework,我可以消除错误,但按照建议,我试图避免在单元测试中实例化对象,并在需要时将对象创建传递给我的框架。另一方面,使TestFramework中的getLoginPage()成为静态的,会在我的TestFramework类中创建一大堆类似的错误 类测试。java: public class Tests { @

我不明白为什么这里的错误“非静态方法getLoginPage()不能从静态上下文引用”!?这里没有静电!看起来很琐碎,但我不确定我错过了什么

编辑: 我知道通过实例化TestFramework,我可以消除错误,但按照建议,我试图避免在单元测试中实例化对象,并在需要时将对象创建传递给我的框架。另一方面,使TestFramework中的getLoginPage()成为静态的,会在我的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.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将所有内容设置为静态不是一个好主意。记住,静态方法中使用的变量和方法也是静态的。不要那样做。使用实例。