2016-06-16 51 views
3

對於Java來說,這可能是不可能完成的任務,但我想知道是否有任何專業人士有解決方案。 [使用Java已經有好幾年了,大學真的很好]在Java中,可以合併兩個類,以便兩個類的方法都可以從一個類中調用?

我正在構建一個QA框架。如果問題沒有意義,請提出任何問題或提出任何標記。

使用Selenium Webdriver,我們有一個驅動程序類。

public class Driver { 

private final String browser; 
private final WebDriver driver; 

public Driver(String browser) { 
    driver = new RemoteWebDriver(new URL(Environment_address)); 
} 

我首先提到這個類,因爲它需要被運行每個測試用例的測試類以及帶有附加方法的庫所使用。 (輔助方法)

class UserPageUtils{ 
    private final Webdriver driver; 

    public UserPageUtils(driver){ 
     this.driver = driver; 
    } 

    public void makeUsersLifeMiserable(){...} 
} 

class ActionPageUtils{ 
    private final Webdriver driver; 

    public ActionPageUtils(driver){ 
     this.driver = driver 
    } 

    public void doSomethingCoolWithAction(){...} 
} 

隨着這些例子中,有一個方法來合併到類成一個類或變量?我沒有想到的設計模式。我有以下幾點,我該如何安排課程,以便下面是可能的,或類似的效果。

public TestSuite extends AverageEverydayTestSuiteLikeTestNG{ 

@BeforeMethod 
public void setUp(Object[] objects) { 
    HelperUtils utils = merge('ActionPageUtils','UserPageUtils', driver); 
    // Similarly in psuedo 
    // HelperUtils utils = merge(new ActionPageUtils(driver), new UserPageUtils(driver)); 
} 

@Test 
public void testUserAction(HelperUtil utils){ 
    utils.makeUsersLifeMiserable(); //util has methods from both classes!! 
    utils.doSomethingCoolWithAction(); 

    assert something is still passing. 
} 

是否有可能在java中做這樣的事情?在一個類中創建兩個包裝器。我無法將頭圍繞在結構上。我覺得這是更可能的bash或某事,但不知道如果Java可以做這樣的事情。

該如何實施?

使用[爪哇,硒,Groovy中]

+0

怎麼樣的JUnit TestSuite http://www.tutorialspoint.com/junit/junit_suite_test.htm –

+0

看起來像你想的頁面對象,對不對?將基類定義爲抽象並擴展其他頁面對象類。看看[這](https://www.seleniumeasy.com/selenium-tutorials/simple-page-object-model-framework-example)例子,可能它會幫助 – Rao

+0

呵呵,不是一個壞的方法......但類似的東西。我並沒有試圖將多個測試用例合併在一起構成一個大套件。然而,我試圖將多個圖書館班分成一個大班。 目標是:測試用例將依賴多個庫來幫助運行測試。 @ScaryWombat – Baconbitz

回答

0

Java沒有多重繼承。你可以儘管完成你在幾個方面想:

純接口:

interface UserPageUtils{ 
    public void makeUsersLifeMiserable(); 
} 

interface ActionPageUtils{ 
    public void doSomethingCoolWithAction(); 
} 

class PageUtils implements UserPageUtils, ActionPageUtils { 
    //concrete implementations 
} 

Facade模式:

class UserPageUtils{ 
    private final Webdriver driver; 

    public UserPageUtils(driver){ 
     this.driver = driver; 
    } 

    public void makeUsersLifeMiserable(){...} 
} 

class ActionPageUtils{ 
    private final Webdriver driver; 

    public ActionPageUtils(driver){ 
     this.driver = driver 
    } 

    public void doSomethingCoolWithAction(){...} 
} 

class PageUtils{ 
    private final Webdriver driver; 
    private final ActionPageUtils action; 
    private final UserPageUtils user; 

    public void doSomethingCoolWithAction(){action.doSomethingCoolWithAction();} 
    public void makeUsersLifeMiserable(){user.makeUsersLifeMiserable();} 
} 

或者,如果您使用的是Java 8,你可以在默認的方法你的接口:

interface UserPageUtils{ 
     public Webdriver getDriver(); 
     default void makeUsersLifeMiserable(){ 
      //somewhere here you use getDriver(); 
     } 
    } 

    interface ActionPageUtils{ 
     public Webdriver getDriver(); 
     default void doSomethingCoolWithAction() { 
      //somewhere here you use getDriver(); 
     } 
    } 

    class PageUtils implements UserPageUtils, ActionPageUtils { 
     private final Webdriver driver; 

     @Override 
     public Webdriver getDriver() { 
      return driver; 
     } 
    } 
+0

我們使用Java 8,這很有幫助。那麼問一下,在PageUtils下我們是否會創建/定義更具體的實現,或者Java 8是否遵循對接口的引用? 希望儘可能動態,如果可能的話。其他方面,這將起作用。 @Ulises – Baconbitz

+0

默認方法就像靜態方法,所以你必須通過定義的接口方法來訪問類字段,就像我的答案中所顯示的那樣 – Ulises

0

我可以想到兩種方法。

一個可能與裝飾設計模式和另一個與命令和宏命令設計模式。

使用裝飾器,您可以將HelperUtils作爲主類,然後其他Utils可以對其進行裝飾。您可以對不同的裝飾器進行不同的測試,併爲您的測試提供靈活性並重用您的Utils。

使用另一種方法,您可以讓每個Utils實現Command接口。然後,爲每個測試定義宏命令,以便「執行」方法調用每個您想要的Utils的每個「執行」方法。

從我的理解我會首先去裝飾者的方法,但另一個也可能是有益的,如果裝飾沒有得到你所需要的。

希望它有幫助。

1

使用外觀模式如下圖所示,代替合併可以調用構造函數HelperUtils類會是這樣。

public class HelperUtils { 

    ActionPageUtils actionPageUtils; 
    UserPageUtils userPageUtils; 
    public HelperUtils(ActionPageUtils actionPageUtils, UserPageUtils userPageUtils, Webdriver driver) { 
     this.actionPageUtils = actionPageUtils; 
     this.userPageUtils = userPageUtils; 
    } 

    public void doSomethingCoolWithAction(){actionPageUtils.doSomethingCoolWithAction();} 
    public void makeUsersLifeMiserable(){userPageUtils.makeUsersLifeMiserable();} 

    public static void main(String[] args) { 
     HelperUtils utils = new HelperUtils(new ActionPageUtils("Chrome"), new UserPageUtils("firefox"), driver); 
     utils.makeUsersLifeMiserable(); 
     utils.doSomethingCoolWithAction(); 
    } 

} 

缺點這種方法的:

你必須創造新的方法總是每當你正在更新的子類或合併類。

相關問題