在Java中,是否可以合并两个类,以便从一个类调用两个类中的方法?
对于Java来说,这可能是一项不可能完成的任务,但我想知道是否有专业人士有解决方案。[我已经好几年没有使用Java了,真的] 我正在为QA建立一个框架。如果有什么不合理的地方,请提出任何问题或升起任何旗帜 使用SeleniumWebDriver,我们有一个驱动程序类在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)
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方法类似于静态方法,因此您必须通过定义的接口方法访问类字段,如我的回答中所示