2016-06-16 12 views
3

これはJavaにとって不可能な作業かもしれませんが、プロのいずれかが解決策を持っているかどうかは疑問です。 [Javaを使い始めてから数年経ちましたが、実際には大学のほうが]Javaでは、2つのクラスをマージして、両方のクラスのメソッドを1つから呼び出せるようにすることは可能ですか?

私は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で行うことはできますか? 1つのクラスに2つのラッパーを作成します。私は構造化の周りに私の頭を包むことはできません。私はこれがbashや何かでもっと可能なように感じますが、もしJavaがそのようなことをすることができるかどうかは分かりません。

これはどのように実装できますか?

[ジャワ、セレン、Groovyの]

+0

Junit TestSuiteについて教えてください。http://www.tutorialspoint.com/junit/junit_suite_test.htm –

+0

ページオブジェクトを試しているようですね。抽象クラスとして基本クラスを定義し、他のページオブジェクトクラスを拡張します。 [this](https://www.seleniumeasy.com/selenium-tutorials/simple-page-object-model-framework-example)の例を参照してください。おそらく助けになります – Rao

+0

ああ、悪いアプローチではありませんが、似たようなものです。私は1つの大きなスイートを作るために複数のテストケースを一緒にマージしようとしていません。私はしかし、1つの大きなクラスに複数のライブラリクラスをグループ化しようとしています。 目標:テストケースは、テストの実行に役立つ複数のライブラリに依存します。 @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

私は2つのアプローチが考えられます。

デコレータデザインパターンでも、コマンドとマクロコマンドデザインパターンでも構いません。

デコレータを使用すると、HelperUtilsをメインクラスとして使用し、他のUtilsがそれを飾ることができます。異なるデコレータで異なるテストを行い、テストに柔軟性を持たせ、Utilsを再利用することができます。

他のアプローチでは、各UtilsにCommandインタフェースを実装させることができます。次に、テストごとにマクロコマンドを定義し、実行するメソッドが、それぞれのUtilsの "実行"メソッドを呼び出すようにします。

最初にデコレータのアプローチに行きましたが、デコレータが必要なものを手に入れていない場合は、もう一方が役立つ可能性があります。

希望します。

1

以下のようなFacadeパターンを使用してください。コンポーザーを呼び出す代わりに、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(); 
    } 

} 

欠点:

あなたは、サブクラスまたはマージされたクラスを更新しているときはいつでも、常に新しい方法を作成しています。

関連する問題