Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何将一个方法重构为一个类,然后在其他类中使用它的参数?_Java - Fatal编程技术网

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

Java:如何将一个方法重构为一个类,然后在其他类中使用它的参数?,java,Java,在这里有3周的Java经验。 我有两个类-AppTest和AppTest2,它们中的代码都相同: 这是我的密码: public class Apptest/AppTest2 { public WebDriver driver; public WebDriverWait wait; @DataProvider(name = "dataProvider") public Object[][] setUp() throws Exception { F

在这里有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()),使其成为类,然后将这些变量传递给下一个空的“twoUsersSignUp”

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

EDIT2:在我实现了accepted answer的解决方案之后,我现在在将变量“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注释后,它被排除在外!

您不能只将方法转换为类


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

您不能仅将方法转换为类


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

您不能将方法转换为类,但可以将方法移动到一个位置,从该位置它将被
Apptest
AppTest2
共享:创建基类,并使
Apptest
AppTest2
类扩展它


现在,
setUp
方法的代码不需要重复,它使用了
twoUsersSignUp
方法的实现,该方法在
AbstractAppTest

的两个子类中提供,您不能将一个方法转换为一个类,但您可以将一个方法移动到一个由两个共享的地方e> Apptest
AppTest2
:创建一个基类,并使
Apptest
AppTest2
类扩展它


现在,
设置
方法的代码不需要重复,它使用了
twoUsersSignUp
方法的实现,该方法在
AbstractAppTest
的两个子类中提供,至少在Eclipse上是这样

手动执行此操作的变通方法


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

您正在寻找的重构类型,至少在Eclipse上是这样

手动执行此操作的变通方法


顺便说一句,在Eclipse中,通过按ALT SHIFT T,您将发现所有当前可用的重构现有代码的可能性,方法是提取方法、类等。

像这样初始化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

     }

    }

像这样初始化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

     }

    }

“将方法转换为类”是什么意思?它们是两个完全不同的东西;你的动机是什么?@JennyKowalski你不能用
@AfterClass
注释一个非静态方法-你的
quit
方法必须是静态的。但是它不能访问
驱动程序
变量,除非它也是
静态的。@JennyKowalski the
@aAfterClass
无法“理解”
@参数,因此没有
驱动程序
传递给它。不过,该方法可以访问
AbstractAppTest
类的
驱动程序
,因此您可以在使该变量为静态后删除该参数。@JennyKowalski您尝试过我上面建议的方法吗(删除参数并使变量为静态)?@JennyKowalski我不再是JUnit的最新版本(我在C#工作了5年多)。您可能希望将后续问题作为一个单独的问题发布,用
设置
twoUsersSignUp
退出
方法将其抽象为一个类,因为拆分为两个类对于
退出
不退出驱动程序不是必需的。您所说的“将方法转换为类”是什么意思?它们是两个完全不同的东西;你的动机是什么?@JennyKowalski你不能用
@AfterClass
注释一个非静态方法-你的
quit
方法必须是静态的。但是它不能访问
驱动程序
变量,除非它也是
静态的。@JennyKowalski the
@aAfterClass
无法“理解”
@参数,因此没有
驱动程序
传递给它。不过,该方法可以访问
AbstractAppTest
类的
驱动程序
,因此您可以在使该变量为静态后删除该参数。@JennyKowalski您尝试过我上面建议的方法吗(删除参数并使变量为静态)?@JennyKowalski我不再是JUnit的最新版本(我在C#工作了5年多)。您可能希望将后续问题作为一个单独的问题发布,用
设置
twoUsersSignUp
退出
方法将其抽象为一个类,因为将其分为两个类并不是
退出
不退出驱动程序的必要条件。谢谢!发生了另一个问题,我已更改了我的que用我描述过的EDIT2继续。@dasblinkenlight谢谢!发生了另一个问题,我用我描述过的EDIT2更改了我的问题。@dasblinkenlight