在Java中可以合并两个类,以便可以从一个类调用两个类的方法吗?

时间:2016-06-16 01:31:26

标签: java selenium groovy

这对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是否可以做这样的事情。

如何实施或将如何实施?

使用[Java,Selenium,Groovy]

3 个答案:

答案 0 :(得分:1)

使用如下所示的Facade Pattern,而不是合并,你可以调用构造函数,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();
    }

}

这种方法的缺点:

无论何时更新子类或合并类,都要创建新方法。

答案 1 :(得分:0)

Java没有多重继承。您可以通过多种方式完成您想要的任务:

Pure Interfaces:

interface UserPageUtils{
    public void makeUsersLifeMiserable();
}

interface ActionPageUtils{
    public void doSomethingCoolWithAction();
}

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

立面图案:

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;
        }
    }

答案 2 :(得分:0)

我可以想到两种方法。

一个可以使用装饰器设计模式,另一个可以使用命令和宏命令设计模式。

使用装饰器,您可以将HelperUtils作为主类,然后其他Utils可以装饰它。您可以使用不同的装饰器进行不同的测试,并为您的测试提供灵活性并重用您的Util。

使用另一种方法,您可以让每个Utils实现一个Command接口。然后,为每个测试定义宏命令,这样它的“执行”方法就会调用你想要的每个Utils的每个“execute”方法。

根据我的理解,我会首先选择装饰器方法,但如果装饰器不能满足你的需要,另一个方法也会有用。

希望它有所帮助。