Java:如何将一个方法重构为一个类,然后在其他类中使用它的参数?

标签 java

3 周的 Java 经验。 我有这两个类——AppTest 和 AppTest2,它们中的代码相同:

这是我的代码:

public class Apptest/AppTest2 {
     public WebDriver driver;
     public WebDriverWait wait;

     @DataProvider(name = "dataProvider")
     public Object[][] setUp() throws Exception {
     File firefoxPath = new File(System.getProperty("lmportal.deploy.firefox.path", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"));
     FirefoxBinary ffox = new FirefoxBinary(firefoxPath);
     ffox.setEnvironmentProperty("DISPLAY", ":20");
     driver = new FirefoxDriver(ffox, null);
     wait = new WebDriverWait(driver, timeoutInSeconds );
     Object[][] data = new Object[1][2];
     data[0][0] = driver;
     data[0][1] = wait;
     return data;
 }

  @Parameters({ "driver", "wait" })
  @Test(dataProvider = "dataProvider")
  public void twoUsersSignUp(WebDriver driver, WebDriverWait wait) throws InterruptedException{

       //test here

     }
}

我怎样才能取出这段代码 (setUp()),使其成为一个类,然后将这些变量传递给下一个 void "twoUsersSignUp"

编辑:我不是在寻找自动解决方案,我只是想重构它,所以我在两个类中没有相同的代码

EDIT2:在我实现了接受的答案的解决方案之后,我现在遇到了将变量“driver”传递给第一类中的下一个方法的问题:

     @AfterClass
     public void quit () {
         driver.quit();
     }

我该怎么做?

EDIT3:这是@AfterClass 解决方案:

     @SuppressWarnings("deprecation")
     @Configuration 
     @AfterClass
     public static void quit (@Optional WebDriver driver) {
         driver.quit();
     }

EDIT4:实际上 EDIT3 不起作用,它只是隐藏了来自 Eclipse 的错误。我仍然无法访问“驱动程序”:(

EDIT5:我决定我不需要在 AfterClass TestNG 注释中使用它,所以我删除了所有不必要的东西,它现在看起来像这样:

     public static void quit (WebDriver driver) {
         driver.quit();
     }

变量是这样声明的:

public static WebDriver driver;

还是不行

EDIT6:通过实际调用测试代码中的方法解决了这个问题。之前我不必调用它,因为 testng.xml 已经调用了它,但是在我删除 @AfterTest 注释后,它已被排除在外!

最佳答案

你不能将一个方法转换为一个类,但是你可以将一个方法移动到一个可以被 ApptestAppTest2 共享的地方:创建一个基类类,并使 ApptestAppTest2扩展它。

public abstract class AbstractAppTest {
    public WebDriver driver;
    public WebDriverWait wait;

    @DataProvider(name = "dataProvider")
    public Object[][] setUp() throws Exception {
        File firefoxPath = new File(System.getProperty("lmportal.deploy.firefox.path", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"));
        FirefoxBinary ffox = new FirefoxBinary(firefoxPath);
        ffox.setEnvironmentProperty("DISPLAY", ":20");
        driver = new FirefoxDriver(ffox, null);
        wait = new WebDriverWait(driver, timeoutInSeconds );
        Object[][] data = new Object[1][2];
        data[0][0] = driver;
        data[0][1] = wait;
        twoUsersSignUp(data);
        return data;
    }
    public abstract void twoUsersSignUp(@Optional Object[][] data) throws InterruptedException; 
}
public class Apptest extends AbstractAppTest {
    public void twoUsersSignUp(@Optional Object[][] data) throws InterruptedException {
        ...
    }
}
public class AppTest2 extends AbstractAppTest {
    public void twoUsersSignUp(@Optional Object[][] data) throws InterruptedException {
        ...
    }
}

现在setUp方法的代码就不用重复了,它使用了的两个子类各自提供的twoUsersSignUp方法的实现>AbstractAppTest.

关于Java:如何将一个方法重构为一个类,然后在其他类中使用它的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17991222/

相关文章:

java - Applet(或 WebStart 应用程序)调用服务器 : best practices?

Java Tomcat LDAP 身份验证

java - 移动 OSGi 是否已准备好在手机上实际使用?

java - 您如何为您的 Java Web 应用程序自动化 Javascript 缩小?

java - Android - 使用已弃用的 API 的危险

java - 如何在Java中的Prepared Select语句中包含参数?

java - hibernate 中的 ID 类型

java - 如何从 TreeMap 中获取第 n 项?

java - 如何让 printf %x 类似于 python

java - 如何计算数组中重复的字符串?