动态加载从罐子步骤的定义文件

问题描述 投票:1回答:1

我有一个小黄瓜执行,我执行我的功能文件。我想这样做将是从其他jar添加StepDefinition文件。用户将能够使用我的项目,我已经写了一步DEF但他也将能够从自己的jar文件添加用户自定义。

目前,我有一个JavaClassLoader,我从我的罐子加载我的课,我用它在我的主

public class JavaClassLoader<C> extends ClassLoader {

public C LoadClass(String directory, String classpath, Class<C> parentClass) throws ClassNotFoundException {
    File pluginsDir = new File(System.getProperty("user.dir") + directory);
    for (File jar : pluginsDir.listFiles()) {
      try {
        ClassLoader loader = URLClassLoader.newInstance(
            new URL[] { jar.toURL() },
            getClass().getClassLoader()
        );
        Class<?> clazz = Class.forName(classpath, true, loader);
        Class<? extends C> newClass = clazz.asSubclass(parentClass);
        // Apparently its bad to use Class.newInstance, so we use 
        // newClass.getConstructor() instead
        Constructor<? extends C> constructor = newClass.getConstructor();
        return constructor.newInstance();

      } catch (ClassNotFoundException e) {
        // There might be multiple JARs in the directory,
        // so keep looking
        continue;
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (NoSuchMethodException e) {
        e.printStackTrace();
      } catch (InvocationTargetException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      } catch (InstantiationException e) {
        e.printStackTrace();
      }
    }
    throw new ClassNotFoundException("Class " + classpath
        + " wasn't found in directory " + System.getProperty("user.dir") + directory);
  }

}

JavaClassLoader<AbstractStepDefs> loader = new JavaClassLoader<AbstractStepDefs>();  
    loader.LoadClass("/", "stepDef.dynamicClass", AbstractStepDefs.class);  

问题是,黄瓜是无法读取,我在我的其他jar写的方法。有没有办法使用了一步DEF文件不在项目的方法吗?

java cucumber cucumber-jvm gherkin cucumber-java
1个回答
0
投票

有没有办法使用了一步DEF文件不在项目的方法吗?

是的,没有。该是部分更接近“的排序”。 git的支持一对夫妇的其他项目中引用子项目的方式。常见的“子项目”保持在自己的项目,然后拉成使用项目。看here了讨论。我看着曾经做的子模块。我甚至有它的工作。但我无法说服TeamCity的业主支持。它的工作原理,但你必须要小心你如何使用它。有haters

我落得这样做是创建包含页面文件的通用登录和导航页面共享“全球性”的项目。这一全球项目还包含了所有不同的浏览器和对SauceLabs远程执行开机和关机的支持。

步骤定义必须重复(呸,我更喜欢DRY),但这些都是小,因为它们大多只是调用页面文件的方法。所有这些网页都在自己的类文件的全球项目定义。公共持家代码在类WebDriverManager定义。

@Given("^I navigate to the public ACME WebPage and select Login$")
public void iNavigateToTheAcmePublicWebPage() {
    pageFactory.AcmePublicWebPage().navigateTo(
      WebDriverManager.instance().getAcmeUrl());

    pageFactory.AcmePublicWebPage().closeNotificationPopUp(); //If there is one
    pageFactory.AcmePublicWebPage().selectLoginLink();
}

@When("^I close the browser$")
public void iCloseTheBrowser() {
    WebDriverManager.instance().closeBrowser();
}

我已经减少了大多数,但不是所有的重复。最初级的测试自动化工程师不必只要我保持全球Git项目时,他们需要从TeamCity的下载一个新的全球罐子通知他们担心繁重。

© www.soinside.com 2019 - 2024. All rights reserved.