【发布时间】:2022-07-08 01:19:06
【问题描述】:
我有一个使用 Cucumber BOM 7.4.1 的 Spring Boot 2.7.1(但 2.6.4 也是如此)项目。
testImplementation(platform("io.cucumber:cucumber-bom:7.4.1"))
testImplementation group: 'io.cucumber', name: 'cucumber-java8'
testImplementation group: 'io.cucumber', name: 'cucumber-spring'
testImplementation group: 'io.cucumber', name: 'cucumber-junit-platform-engine'
我的切入点是:
@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("features")
@ConfigurationParameters({
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "my.project.cucumber"),
@ConfigurationParameter(key = FILTER_TAGS_PROPERTY_NAME, value = "@Dwh"),
@ConfigurationParameter(key = JUNIT_PLATFORM_NAMING_STRATEGY_PROPERTY_NAME, value = "long"),
@ConfigurationParameter(key = PLUGIN_PUBLISH_QUIET_PROPERTY_NAME, value = "true"),
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "json:build/cucumber/cucumber.json")
})
public class RunCucumberDwhTest {
}
我的胶水代码:
@SpringBootTest(classes = DwhE2EApplication.class, webEnvironment = RANDOM_PORT)
@ContextConfiguration(classes = DwhE2EApplication.class)
@CucumberContextConfiguration
@ActiveProfiles("test")
public class DwhStepDef implements En {
....
}
运行 Cucumber 测试时,我收到此错误:
io.cucumber.core.backend.CucumberBackendException: 没有测试实例 在 app//io.cucumber.spring.TestContextAdaptor.notifyTestContextManagerAboutAfterTestMethod(TestContextAdaptor.java:129) 在 app//io.cucumber.spring.TestContextAdaptor.stop(TestContextAdaptor.java:109) 在应用程序//io.cucumber.spring.SpringFactory.stop(SpringFactory.java:159) 在 app//io.cucumber.core.runner.Runner.disposeBackendWorlds(Runner.java:156) 在应用程序//io.cucumber.core.runner.Runner.runPickle(Runner.java:78) 在 app//io.cucumber.junit.platform.engine.CucumberEngineExecutionContext.lambda$runTestCase$4(CucumberEngineExecutionContext.java:112) 在 app//io.cucumber.core.runtime.CucumberExecutionContext.lambda$runTestCase$5(CucumberExecutionContext.java:129) 在 app//io.cucumber.core.runtime.RethrowingThrowableCollector.executeAndThrow(RethrowingThrowableCollector.java:23) 在 app//io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:129) 在 app//io.cucumber.junit.platform.engine.CucumberEngineExecutionContext.runTestCase(CucumberEngineExecutionContext.java:109) 在 app//io.cucumber.junit.platform.engine.PickleDescriptor.execute(PickleDescriptor.java:100) 在 app//io.cucumber.junit.platform.engine.PickleDescriptor.execute(PickleDescriptor.java:29) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) 在 app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) 在 app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) 在 app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) 在 java.base@17.0.1/java.util.ArrayList.forEach(ArrayList.java:1511) 在 app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) 在 app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) 在 app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) 在 app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) 在 java.base@17.0.1/java.util.ArrayList.forEach(ArrayList.java:1511) 在 app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) 在 app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) 在 app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) 在 app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) 在 app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) 在 app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) 在 app//org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) 在 app//org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) 在 app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) 在 app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) 在 app//org.junit.platform.suite.engine.SuiteLauncher.execute(SuiteLauncher.java:59) 在 app//org.junit.platform.suite.engine.SuiteTestDescriptor.execute(SuiteTestDescriptor.java:130) 在 app//org.junit.platform.suite.engine.SuiteTestEngine.lambda$execute$0(SuiteTestEngine.java:73) 在 java.base@17.0.1/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) 在 java.base@17.0.1/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) 在 java.base@17.0.1/java.util.Iterator.forEachRemaining(Iterator.java:133) 在 java.base@17.0.1/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845) 在 java.base@17.0.1/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) 在 java.base@17.0.1/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) 在 java.base@17.0.1/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) 在 java.base@17.0.1/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) 在 java.base@17.0.1/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 在 java.base@17.0.1/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) 在 app//org.junit.platform.suite.engine.SuiteTestEngine.execute(SuiteTestEngine.java:73) 在 app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) 在 app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) 在 app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) 在 app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) 在 app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) 在 app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) 在 app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) 在 app//org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) 在 app//org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) 在 org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) 在 org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) 在 org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) 在 org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61) 在 java.base@17.0.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 java.base@17.0.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) 在 java.base@17.0.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base@17.0.1/java.lang.reflect.Method.invoke(Method.java:568) 在 org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) 在 org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 在 org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) 在 org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) 在 jdk.proxy2/jdk.proxy2.$Proxy5.stop(未知来源) org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193) 在 org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) 在 org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) 在 org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) 在 org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) 在 org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133) 在 org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) 在 app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) 在 app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) 引起:java.lang.IllegalStateException:没有测试实例 org.springframework.util.Assert.state(Assert.java:76) 在 org.springframework.test.context.support.DefaultTestContext.getTestInstance(DefaultTestContext.java:160) 在 io.cucumber.spring.TestContextAdaptor.notifyTestContextManagerAboutAfterTestMethod(TestContextAdaptor.java:125) ... 89 更多
我可以在日志中看到我的 Spring Context 被加载,内存中的 DB 被引导......之后它失败了。
在调试模式下,我看到 Given/When/Then 步骤被捕获,所以我的功能文件肯定找到了。
实际上,当 Cucumber 在一个步骤执行后执行一些清理时,它似乎失败了:
在 io.cucumber.spring.TestContextAdaptor 的某个时刻,我们有这个方法被调用:
private void notifyTestContextManagerAboutAfterTestMethod() {
try {
Object delegateTestInstance = delegate.getTestContext().getTestInstance();
Method dummyMethod = TestContextAdaptor.class.getMethod("cucumberDoesNotHaveASingleTestMethod");
delegate.afterTestMethod(delegateTestInstance, dummyMethod, null);
} catch (Exception e) {
throw new CucumberBackendException(e.getMessage(), e);
}
}
是 delegate.getTestContext().getTestInstance() 引发异常,因为 testInstance 为空。
知道为什么会这样吗?
【问题讨论】:
标签: java spring-boot cucumber-spring cuucmber