Closed niagara1983 closed 6 years ago
Hi @niagara1983
I assume you using Cucumber data tables in your scenarios and one of them is commented out?
This then throws an exception when parsing for step row data.
In the meantime, to workaround this issue, comment back the Cucumber data table in your scenario(s)
I'll provide a fix for this in 2.4.0
your assumption is correct. But I don't have a commented out line in the scenarios. see attached file for the cucumber.json cucumber.json.zip
Unfortunately, I cannot open the zip file, says its corrupted.
Try this one
Thanks - this works.
So the issue is in the Courgette json parser which assumed your Cucumber data table contained a row header + row cell.
In your case, your tests only has a row cell therefore the Courgette json parser threw an exception.
This will be fixed in the next release.
that makes totally sense because this issue does not occur in other scenarios. Thanks Prashant. Any idea on when you are planning the next release?
In addition to this fix, I will be upgrading to Cucumber-JVM 3.0.1 in the next release which should be in a day or 2.
This is now released.
From Cucumber 3 - Data tables have moved into a new package. You will have to update your tests accordingly.
io.cucumber.datatable.DataTable
Thanks a lot prashant!
I have made the changes and I am getting the following error:
cucumber.runtime.CucumberException: java.lang.NoSuchMethodException: cucumber.runtime.groovy.GroovyBackend.<init>(cucumber.runtime.io.ResourceLoader, io.cucumber.stepexpression.TypeRegistry) at cucumber.runtime.Reflections.newInstance(Reflections.java:53) at cucumber.runtime.Reflections.instantiateSubclasses(Reflections.java:35) at cucumber.runtime.Runtime.loadBackends(Runtime.java:89) at cucumber.runtime.Runtime.<init>(Runtime.java:42) at courgette.runtime.CourgetteFeatureLoader.createRuntime(CourgetteFeatureLoader.java:60) at courgette.runtime.CourgetteFeatureLoader.<init>(CourgetteFeatureLoader.java:30) at courgette.api.junit.Courgette.<init>(Courgette.java:36) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104) at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:88) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:59) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:39) at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) at com.sun.proxy.$Proxy1.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:109) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:146) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) at java.base/java.lang.Thread.run(Thread.java:844) Caused by: java.lang.NoSuchMethodException: cucumber.runtime.groovy.GroovyBackend.<init>(cucumber.runtime.io.ResourceLoader, io.cucumber.stepexpression.TypeRegistry) at java.base/java.lang.Class.getConstructor0(Class.java:3302) at java.base/java.lang.Class.getConstructor(Class.java:2110) at cucumber.runtime.Reflections.newInstance(Reflections.java:45)
Can you run any feature successfully using Cucumber version 3.0.1 because this exception is thrown by Cucumber?
Without using the Courgette runner.
Add this to your build.gradle
testCompile group: 'io.cucumber', name: 'cucumber-groovy', version: '2.0.1'
I already had that line in my build.gradle file. could it be a conflict between cucumber core 2.0.1 and the one that comes with courgette-jvm:2.4.0, which is 3.0.1.
try changing to testCompile
testCompile group: 'io.cucumber', name: 'cucumber-groovy', version: '2.0.1'
cucumber-groovy simply inherits the cucumber-core module that's present in your project so there won't be any conflicts.
gotcha. I am still getting the same error ... I updated this project https://github.com/niagara1983/ui-automation to reproduce this error. if I go back to previous version courgette-jvm 2.3.2, things run fine with the original issue and everything runs fine with courgette-jvm 1.4.3. Would you mind taking a look on my project? worse case scenario, I can go back to courgette-jvm 2.3.2 and update my datatable to workaround the issue for now. I like the new reports in 2.3.2 :-) so I would like to use it.
Right, so the cucumber-groovy library is not updated to run with Cucumber 3.
The GroovyBackend is missing the following constructor so Cucumber 3 cannot create the runtime.
public GroovyBackend(ResourceLoader resourceLoader, TypeRegistry typeRegistry) {
}
Until cucumber-groovy is updated to support cucumber 3, you can use this workaround:
In your build.gradle, add this.
//courgette
testCompile ('io.github.prashant-ramcharan:courgette-jvm:2.4.0') {
exclude group: 'io.cucumber'
}
testCompile 'io.cucumber:cucumber-core:2.4.0'
testCompile 'io.cucumber:cucumber-java:2.4.0'
testCompile 'io.cucumber:cucumber-junit:2.4.0'
testCompile group: 'io.cucumber', name: 'cucumber-groovy', version: '2.0.1'
I can confirm this works!
Thank you very much for the prompt replies and for providing this workaround.
Hi prashant, I just upgraded to version 2.3.2 and my scenarios are passing but at the end of the run I get the following error
java.lang.StringIndexOutOfBoundsException: start 0, end -1, length 0 at java.base/java.lang.AbstractStringBuilder.checkRangeSIOOBE(AbstractStringBuilder.java:1698) at java.base/java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:991) at java.base/java.lang.StringBuilder.substring(StringBuilder.java:77) at courgette.runtime.report.JsonReportParser.addStepRowData(JsonReportParser.java:218) at courgette.runtime.report.JsonReportParser.lambda$addSteps$2(JsonReportParser.java:163) at java.base/java.util.ArrayList$Itr.forEachRemaining(ArrayList.java:927) at courgette.runtime.report.JsonReportParser.addSteps(JsonReportParser.java:144) at courgette.runtime.report.JsonReportParser.lambda$parseJsonReport$1(JsonReportParser.java:135) at java.base/java.util.ArrayList.forEach(ArrayList.java:1378) at courgette.runtime.report.JsonReportParser.parseJsonReport(JsonReportParser.java:135) at courgette.runtime.report.JsonReportParser.getReportFeatures(JsonReportParser.java:49) at courgette.runtime.CourgetteHtmlReporter.generateHtmlReport(CourgetteHtmlReporter.java:59) at courgette.runtime.CourgetteHtmlReporter.create(CourgetteHtmlReporter.java:51) at courgette.runtime.CourgetteRunner.createCourgetteReport(CourgetteRunner.java:129) at courgette.api.junit.Courgette.run(Courgette.java:89) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:116) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:59) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:39) at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) at com.sun.proxy.$Proxy1.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:109) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:146) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) at java.base/java.lang.Thread.run(Thread.java:844)
it looks this occurs during the generation of the report. Any idea how to fix this?