【问题标题】:Why the non-static reference error while there is no static defined?为什么在没有定义静态时出现非静态引用错误?
【发布时间】:2014-07-17 11:03:37
【问题描述】:

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

编辑: 我知道通过实例化 TestFramework 我可以摆脱错误,但按照建议,我试图避免在我的单元测试中实例化对象,并在需要时将对象创建传递给我的框架。另一方面,将 TestFramework 中的 getLoginPage() 设为静态,会在我的 TestFramework 类中创建一大堆类似的错误!

类 Tests.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));
}

类 TestFramework.Java:

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的实例...
  • getLoginPage() 方法不是静态的。所以你不能像TestFramework.getLoginPage()那样打电话。您需要创建对象new TestFramework().getLoginPage();
  • 附带说明,您可能希望参考 Java 命名约定,即方法名称以小写开头,没有下划线等
  • @JamesB 对了!过段时间回到Java,忘记命名约定了,谢谢提醒

标签: java unit-testing junit4


【解决方案1】:
TestFramework.getLoginPage().Login(username, password);

在那一行TestFramework 不是实例,编译器将其假定为静态类型。创建TestFramework 的实例并调用该方法。

你可能需要

TestFramework tfWork = new TestFramework();
tfwork.getLoginPage().Login(username, password);
assertTrue(tfWork.getLoginPage().CheckIfLoggedIn(username));

【讨论】:

  • 似乎是这样,但我试图避免在我的测试类中实例化对象,因为不推荐这样做。这是否意味着我需要将框架中的所有内容都设为静态才能从单元测试中调用它?
  • @SabaAhang 将所有内容都设为静态并不是一个好主意。请记住,静态方法中使用的变量和方法也是静态的。不要那样做。使用实例。
【解决方案2】:

TestFramework 不是静态上下文是什么(它是一个类,而不是实例)。

【讨论】:

    【解决方案3】:

    您正在尝试使用类名而不是实例来调用方法。

    TestFramework.getLoginPage().Login(username, password);
    

    insted 这样做

    new TestFramework().getLoginPage().Login(username, password);
    

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多