无法为方案步骤创建黄瓜表达式

Could not create a cucumber expression for scenario step

我 运行 遇到一个问题,即我的自定义黄瓜配置 在同一个测试项目中工作 ,但 不能作为依赖项工作在其他测试项目中

CustomTypeRegistry class:

public class CustomTypeRegistry {

    @ParameterType("customEx\([0-9]+\)")
    public Integer custom(String original) {
        return new Random().nextInt();
    }
}

Java胶水步骤:

@When("generate {custom} for test")
public void testStep(int randomNumber) {
    System.out.println(randomNumber);
}

场景步骤:

When generate customEx(5) for test

当我在存在黄瓜配置的同一个项目中创建测试时,这非常有效。

当我将项目打包到 jar 并将其作为依赖项添加到另一个测试项目时,它会识别该步骤,但在 运行 时我收到错误:

17-11-2021 14:15:55.592 [main] ERROR io.cucumber.core.runtime.Runtime.log - Exception while executing pickle java.util.concurrent.ExecutionException: io.cucumber.core.exception.CucumberException: Could not create a cucumber expression for 'generate {custom} for test'. It appears you did not register a parameter type. at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) at io.cucumber.core.runtime.Runtime.run(Runtime.java:93) at io.cucumber.core.cli.Main.run(Main.java:92) at io.cucumber.core.cli.Main.main(Main.java:34) Caused by: io.cucumber.core.exception.CucumberException: Could not create a cucumber expression for 'generate {custom} for test'. It appears you did not register a parameter type. at io.cucumber.core.stepexpression.StepExpressionFactory.registerTypeInConfiguration(StepExpressionFactory.java:101) at io.cucumber.core.stepexpression.StepExpressionFactory.crateExpression(StepExpressionFactory.java:95) at io.cucumber.core.stepexpression.StepExpressionFactory.createExpression(StepExpressionFactory.java:61) at io.cucumber.core.stepexpression.StepExpressionFactory.createExpression(StepExpressionFactory.java:49) at io.cucumber.core.runner.CachingGlue.lambda$prepareGlue(CachingGlue.java:244) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at io.cucumber.core.runner.CachingGlue.prepareGlue(CachingGlue.java:243) at io.cucumber.core.runner.Runner.runPickle(Runner.java:68) at io.cucumber.core.runtime.Runtime.lambda$execute(Runtime.java:110) at io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:117) at io.cucumber.core.runtime.Runtime.lambda$execute(Runtime.java:110) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:233) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118) at io.cucumber.core.runtime.Runtime.lambda$run(Runtime.java:86) at java.base/java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:195) at java.base/java.util.stream.SliceOps.accept(SliceOps.java:199) at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) at io.cucumber.core.runtime.Runtime.run(Runtime.java:87) ... 2 common frames omitted Caused by: io.cucumber.cucumberexpressions.UndefinedParameterTypeException: Undefined parameter type {custom}. Please register a ParameterType for {custom}. at io.cucumber.cucumberexpressions.CucumberExpression.processParameters(CucumberExpression.java:103) at io.cucumber.cucumberexpressions.CucumberExpression.(CucumberExpression.java:35) at io.cucumber.cucumberexpressions.ExpressionFactory.createExpression(ExpressionFactory.java:34) at io.cucumber.core.stepexpression.StepExpressionFactory.crateExpression(StepExpressionFactory.java:88)

黄瓜版本:6.8.1

构建工具:Maven

什么可能导致问题?

您可以观察到这种行为的可能原因是有一种叫做“粘合路径”的东西,它基本上是一个包,Cucumber 在其中查找代码(包括自定义参数定义)。

默认情况下,cucmber 使用粘合路径作为包含您的跑步者的包 class。所以我假设当您在原始项目中使用代码时满足条件。

但是当您创建一个库并将其用作另一个项目中的依赖项时,Cucumber 不再看到它,因为不再满足条件。

您需要像黄瓜文档中提到的那样手动指定粘合路径

By default Cucumber-JVM will search in the package (or sub-packages) of the runner class. You can also tell Cucumber-JVM explicitly which packages (and sub-packages) to search, with:

 @CucumberOptions(glue = {"<package>", "<package>", "<etc>"})
 public class RunCucumberTest{}