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

时间:2013-08-01 10:16:11

标签: 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注释后,它被排除在那里!

4 个答案:

答案 0 :(得分:2)

您无法将方法转换为类,但您可以将方法移动到ApptestAppTest2共享它的位置:创建基类,然后创建{ {1}}和Apptest个类扩展它。

AppTest2

现在不需要重复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方法的实现。

答案 1 :(得分:1)

您无法将方法转换为类。

但是,您可以创建新对象或修改现有对象。

答案 2 :(得分:1)

像这样初始化你的testData类

public class ApptestData{
 public WebDriver driver;
 public WebDriverWait wait;

 public ApptestData() 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 class Apptest/AppTest2 {

     @Test
     public void twoUsersSignUp() throws InterruptedException{

       AppTestData data = new AppTestData();
       //test here

     }

    }

答案 3 :(得分:0)

您正在寻找的重构类型does not exists yet,至少在Eclipse上。

手动执行此操作is explained here

顺便说一下,在Eclipse中按 ALT SHIFT T ,您将找到重构现有代码的所有当前可能性,提取方法,类等。