黄瓜表达与正则表达式有某种相互作用吗?

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

从Cucumber-JVM 2.X迁移到Cucumber-JVM 5.5.0之后,我遇到了使用正则表达式和可选捕获组的现有步骤defs的问题。对于版本2.X,当小黄瓜步骤中没有可选文本时,步骤定义方法为空值。对于版本5.5.0,如果我不提供小黄瓜步骤中的可选文本,那么我最终会出现异常。

场景

Scenario: cucumber expression vs regular expression
  And text aaaa text2
  And text text2

GlueCode

@Given("^text(?: (.+))? text2$")
public void optionalCaptureGroup(String optionalGroup) {
    System.out.println(optionalGroup);
}


@ParameterType(".+")
public String paramType1(String s) {
    return s;
}

Exception

 io.cucumber.core.exception.CucumberException: Could not convert arguments for step [^text(?: (.+))? text2$] defined at 'migrate.ParameterTypeStepDefinition.optionalCaptureGroup(java.lang.String)'.
The details are in the stacktrace below.
    at io.cucumber.core.runner.PickleStepDefinitionMatch.couldNotConvertArguments(PickleStepDefinitionMatch.java:119)
    at io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:56)
    at io.cucumber.core.runner.TestStep.executeStep(TestStep.java:64)
    at io.cucumber.core.runner.TestStep.run(TestStep.java:49)
    at io.cucumber.core.runner.PickleStepTestStep.run(PickleStepTestStep.java:46)
    at io.cucumber.core.runner.TestCase.run(TestCase.java:51)
    at io.cucumber.core.runner.Runner.runPickle(Runner.java:66)
    at io.cucumber.core.runtime.Runtime.lambda$run$2(Runtime.java:100)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
    at java.util.concurrent.FutureTask.run(FutureTask.java)
    at io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:243)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
    at io.cucumber.core.runtime.Runtime.lambda$run$3(Runtime.java:100)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.stream.SliceOps$1$1.accept(SliceOps.java:204)
    at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1359)
    at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
    at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:499)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:486)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at io.cucumber.core.runtime.Runtime.run(Runtime.java:101)
    at io.cucumber.core.cli.Main.run(Main.java:75)
    at io.cucumber.core.cli.Main.main(Main.java:31)
Caused by: io.cucumber.cucumberexpressions.CucumberExpressionException: ParameterType {paramType1} failed to transform [] to class java.lang.String
    at io.cucumber.cucumberexpressions.ParameterType.transform(ParameterType.java:237)
    at io.cucumber.cucumberexpressions.Argument.getValue(Argument.java:67)
    at io.cucumber.core.stepexpression.ExpressionArgument.getValue(ExpressionArgument.java:15)
    at io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:47)
    ... 25 more
Caused by: io.cucumber.core.backend.CucumberBackendException: Failed to invoke public java.lang.String migrate.ParameterTypeStepDefinition.paramType1(java.lang.String)
    at io.cucumber.java.Invoker.invoke(Invoker.java:29)
    at io.cucumber.java.JavaParameterTypeDefinition.execute(JavaParameterTypeDefinition.java:81)
    at io.cucumber.cucumberexpressions.ParameterType.transform(ParameterType.java:233)
    ... 28 more
Caused by: java.lang.IllegalArgumentException: wrong number of arguments
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at io.cucumber.java.Invoker.invoke(Invoker.java:27)
    ... 30 more

我的问题是:1.为什么我收到关于错误数目的参数的异常的信息-自版本2.X起,可选捕获组的处理是否发生任何变化?2.在步骤定义使用纯正则表达式的情况下,为什么黄瓜要与自定义类型参数交互?

regex cucumber-java
1个回答
0
投票

所以我删除了先前的答案,因为它是错误的。看来Cucumber处理可选参数类型的方式存在错误。

您可以通过定义将数组作为参数的参数类型来解决它。

    @ParameterType(value = ".+")
    public String paramType1(String... s) {
        if (s.length > 0) {
            return s[0];
        }
        return null;
    }

通常,这将用于具有多个捕获组的参数类型,但在这些情况下也适用。

    @ParameterType(value = "([a-z]+)([0-9]+)")
    public String paramType1(String... s) {

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