【问题标题】:Dynamically load step definition file from jar从 jar 动态加载步骤定义文件
【发布时间】:2019-02-05 16:47:20
【问题描述】:

我有一个 Gherkin 执行器,用于执行我的功能文件。我想做的是从另一个 jar 添加一个 StepDefinition 文件。用户可以通过我已经编写的步骤 def 使用我的项目,但他也可以从他自己的 jar 文件中添加自定义定义。

目前我有一个 JavaClassLoader,我从我的 jar 中加载我的类并在我的 main 中使用它

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

问题是 Cucumber 无法读取我在另一个 jar 中编写的方法。有没有办法使用项目中没有的 step def 文件?

【问题讨论】:

    标签: java cucumber cucumber-jvm gherkin cucumber-java


    【解决方案1】:

    有没有办法使用项目中没有的 step 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 下载新的全局 jar 时通知他们。

    【讨论】:

      猜你喜欢
      • 2014-12-29
      • 1970-01-01
      • 2020-06-08
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      相关资源
      最近更新 更多