2013-08-01 1 views
1

3 недели опыта работы с Java здесь. У меня есть эти два класса - AppTest и AppTest2 и у меня есть один и тот же код в обоих из них:Java: Как я могу реорганизовать метод для класса, а затем использовать его параметры в других классах?

Вот мой код:

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 

    } 
} 

Как я могу взять этот код из (нАлАдкА()), сделать его класс, а затем передать эти переменные к следующему ничтожной «twoUsersSignUp»

EDIT: Я не ищу для автоматического решения, я просто хочу, чтобы реорганизовать это, так что я не имею тот же код в обоих классах

EDIT2: После того, как я реализовал принятые Решение Wer, я теперь есть проблема с пропусканием переменного «драйвера» к следующему методу в первом классе:

 @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, она была исключена!

+0

Что вы подразумеваете под «преобразованием метода в класс»? Это две разные вещи; Какова ваша мотивация здесь? –

+0

Возьмите что? Что вам нужно пройти? Вы не можете преобразовать класс в метод. – ClaireG

+0

Ваш вопрос очень неясен. Что вы подразумеваете под словом «Как я могу взять это как класс»? – Filip

ответ

2

Вы не можете преобразовать метод класса, но вы можете переместить метод в место, из которого он будет разделяемым как Apptest и AppTest2: создать базовый класс, и сделать 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 предусмотренного в каждом из двух подклассов AbstractAppTest.

+0

Спасибо! Еще одна проблема: я изменил свой вопрос с EDIT2, где я взломали его. @dasblinkenlight –

1

Вы не можете просто преобразовать метод в класс.

Однако вы можете создавать новые объекты или изменять существующие объекты.

0

Тип рефакторинга, который вы ищете does not exists yet, по крайней мере, на Eclipse.

Обходной сделать это вручную is explained here

Кстати, в Eclipse, нажав ALTSHIFTT вы найдете все текущие доступные возможности реорганизовать существующий код, извлекая методы, классы и т.д.

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 

    } 

    } 
Смежные вопросы