如何基于特征文件位置在java中创建动态粘合?

如何基于特征文件位置在java中创建动态粘合?,java,cucumber,cucumber-jvm,cucumber-junit,cucumber-java,Java,Cucumber,Cucumber Jvm,Cucumber Junit,Cucumber Java,我有一个使用maven构建的java项目 我有多个软件包,基于不同功能的功能文件。项目测试结构如下所示 src ->test ->java ->com ->usercreation TestStepDef.java ->uservalidation TestStepDef.java ->resources ->usercreation

我有一个使用maven构建的java项目

我有多个软件包,基于不同功能的功能文件。项目测试结构如下所示

src
  ->test
    ->java
      ->com
        ->usercreation
          TestStepDef.java
        ->uservalidation
          TestStepDef.java
   ->resources
        ->usercreation
           usercreation.feature
        ->uservaliation
           uservalidatin.feature
我只有一个RunCukesTest.java文件

@RunWith(Cucumber.class)
@CucumberOptions(format = { "html:target/cucumber-html-report",
                        "json:target/cucumber-json-report.json" }, 
                        features = "src/test/resources/",
                        glue = "??????",
                        tags = {"~@ignore"}
            )
 public class RunCukesTest {

 }
在本例中,它将运行“我的所有要素文件”。但它无法找到我对该功能的特定步骤定义。因此,我必须将glue选项设置为“com.usercreation”。但是如果我在运行uservalidation功能文件时这样做,它将无法获取适当的步骤定义。在我的用例中,我不希望两个步骤def文件都在同一个包中,因为它们有许多具有不同功能的步骤


是否有一种可能的方法可以根据功能文件正在运行的包名动态地提供glue选项。或者我错过了这个项目的任何其他方法

将您的
RunCukesTest
移动到所有步骤之上的包中。Cucumber将搜索其类路径,并在同一个包或子包中找到任何步骤

glue = { "classpath:com/usercreation", "classpath:com/uservalidation" },

按照MikeJRamsey56的建议设置位置是另一种选择。

虽然提供了一些很好的替代解决方案,但我没有看到任何人直接回答您的问题

是的,可以动态更改@CucumberOptions(cucumber注释),但是它需要使用Java反射,因为注释不能参数化

要查看动态修改cucumber注释的示例,请参考此项目:

尤其是跑步者。截至今天,可在以下位置找到:

classpath:Surefire默认为src/test/java。关于动态部分,每次运行时都指定一个粘合参数。您可以使用-Dcucumber.options替代,而不是编辑运行程序文件,从而选择要放入类路径中的步骤定义文件。然而,我不建议这样做。记住,我以前试过这种方法。但这种方法的一个缺点是,将来如果有许多包被添加,那么粘合路径参数将继续进行。@googytech只需在类路径下添加文件夹时继续添加粘合术语即可:。事实就是这样。Ruby cucumber能更好地处理这类事情。您只需将所有内容放在支持文件夹下的文件夹中和/或使用World对象即可。@googytech您可以通过接受我的回答来表示感谢…:-)默认情况下,Maven的类路径是src/test/java,因此运行程序必须在那里。链接已断开…:-(