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

在Java中,是否可以合并两个类,以便从一个类调用两个类中的方法?,java,selenium,groovy,Java,Selenium,Groovy,对于Java来说,这可能是一项不可能完成的任务,但我想知道是否有专业人士有解决方案。[我已经好几年没有使用Java了,真的] 我正在为QA建立一个框架。如果有什么不合理的地方,请提出任何问题或升起任何旗帜 使用SeleniumWebDriver,我们有一个驱动程序类 public class Driver { private final String browser; private final WebDriver driver; public Driver(String browser)

对于Java来说,这可能是一项不可能完成的任务,但我想知道是否有专业人士有解决方案。[我已经好几年没有使用Java了,真的]

我正在为QA建立一个框架。如果有什么不合理的地方,请提出任何问题或升起任何旗帜

使用SeleniumWebDriver,我们有一个驱动程序类

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(){...}
}

有了这些示例,有没有一种方法可以将类合并到单个类或变量中?我没有想到的设计模式。我有以下几点,我如何安排课程,使以下内容成为可能,或以类似的效果

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]

Java没有多重继承。您可以通过以下几种方式实现您的目标:

纯接口:

interface UserPageUtils{
    public void makeUsersLifeMiserable();
}

interface ActionPageUtils{
    public void doSomethingCoolWithAction();
}

class PageUtils implements UserPageUtils, ActionPageUtils {
   //concrete implementations
}
    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;
        }
    }
立面样式:

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 void makeUsersLifeMiserable();
}

interface ActionPageUtils{
    public void doSomethingCoolWithAction();
}

class PageUtils implements UserPageUtils, ActionPageUtils {
   //concrete implementations
}
    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;
        }
    }

我可以想出两种方法

一个可以是decorator设计模式,另一个可以是command和macro命令设计模式

使用decorator,您可以将helperutil作为主类,然后其他util可以对其进行装饰。您可以使用不同的装饰器进行不同的测试,并为测试提供灵活性和重用UTIL

使用另一种方法,您可以让每个UTIL实现一个命令接口。然后,为每个测试定义宏命令,使其“执行”方法调用您想要的每个UTIL的每个“执行”方法

据我所知,我会首先选择decorator方法,但如果decorator不能满足您的需求,那么另一种方法也会很有帮助


希望对您有所帮助。

使用下面的Facade模式,而不是merge,您可以调用构造函数HelperUtils类,如下所示

public类HelperUtils{
ActionPageUtils ActionPageUtils;
UserPageUtils UserPageUtils;
公共HelperUtils(ActionPageUtils ActionPageUtils、UserPageUtils UserPageUtils、Webdriver驱动程序){
this.actionPageUtils=actionPageUtils;
this.userPageUtils=userPageUtils;
}
public void doSomethingCoolWithAction(){actionPageUtils.doSomethingCoolWithAction();}
public void makeUsersLifeMiserable(){userPageUtils.makeUsersLifeMiserable();}
公共静态void main(字符串[]args){
HelperUtils utils=newhelperutils(newactionpageutils(“Chrome”)、newuserpageutils(“firefox”)、driver;
utils.makeUsersLifeMiserable();
utils.doSomethingToolWithAction();
}
}
这种方法的缺点是:


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

Junit TestSuite看起来像是在尝试页面对象,对吗?将基类定义为抽象类,并扩展其他页面对象类。例如,这可能会有帮助,嗯,这是一个不错的方法。。。但有点类似。我并不是试图将多个测试用例合并在一起,形成一个大套件。然而,我试图将多个库类分组到一个大类中。目标是:一个测试用例将依赖于多个库来帮助运行测试@ScaryWombat@Rao这篇文章有道理。。。我认为这正是我应该遵循的模式。感谢RaoWe使用Java8,这很有帮助。所以问题tho,在PageUtils下,我们是否需要创建/定义进一步的具体实现,或者Java8是否遵循对接口的引用?如果可能的话,希望尽可能使其动态化。从另一个角度看,这是可行的@UlisesDefault方法类似于静态方法,因此您必须通过定义的接口方法访问类字段,如我的回答中所示