Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem when calling a method from a base spec and assigning the return value to a variable of the same name #1313

Closed
britter opened this issue Apr 23, 2021 · 1 comment · Fixed by #1314

Comments

@britter
Copy link
Contributor

britter commented Apr 23, 2021

Issue description

This looks like a variation of GROOVY-9982 which I can still reproduce with Groovy 3.0.8 but only in the context of a Spock based setup.

I have a BaseSpecification that defines a method foo and I have a specification that inherits from that specification. In the child specification I have a test that declares a variable called foo and assigns it the return value of calling the foo method. If I then also have another variable, dereferencing that variable causes a NullPointerException.

How to reproduce

Check out this project and run ./gradlew build

Stacktrace:

Cannot invoke method call() on null object
java.lang.NullPointerException: Cannot invoke method call() on null object
	at com.example.SimpleSpecification.simple test(SimpleSpecification.groovy:7)
	Suppressed: java.lang.NullPointerException: Cannot invoke method length() on null object
		at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
		at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:44)
		at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
		at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:34)
		at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
		at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
		at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130)
		at com.example.SimpleSpecification.$spock_feature_1_0(SimpleSpecification.groovy:17)
		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:566)
		at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:198)
		at org.spockframework.runtime.model.MethodInfo.lambda$new$0(MethodInfo.java:43)
		at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:136)
		at org.spockframework.runtime.PlatformSpecRunner.invokeRaw(PlatformSpecRunner.java:406)
		at org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:389)
		at org.spockframework.runtime.PlatformSpecRunner.runFeatureMethod(PlatformSpecRunner.java:334)
		at org.spockframework.runtime.IterationNode.execute(IterationNode.java:48)
		at org.spockframework.runtime.SimpleFeatureNode.execute(SimpleFeatureNode.java:58)
		at org.spockframework.runtime.SimpleFeatureNode.execute(SimpleFeatureNode.java:15)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
		at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
		at org.spockframework.runtime.SpockNode.sneakyInvoke(SpockNode.java:40)
		at org.spockframework.runtime.IterationNode.lambda$around$0(IterationNode.java:63)
		at org.spockframework.runtime.PlatformSpecRunner.lambda$createMethodInfoForDoRunIteration$5(PlatformSpecRunner.java:239)
		at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:136)
		at org.spockframework.runtime.PlatformSpecRunner.invokeRaw(PlatformSpecRunner.java:406)
		at org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:389)
		at org.spockframework.runtime.PlatformSpecRunner.runIteration(PlatformSpecRunner.java:221)
		at org.spockframework.runtime.IterationNode.around(IterationNode.java:63)
		at org.spockframework.runtime.SimpleFeatureNode.lambda$around$0(SimpleFeatureNode.java:52)
		at org.spockframework.runtime.SpockNode.sneakyInvoke(SpockNode.java:40)
		at org.spockframework.runtime.FeatureNode.lambda$around$0(FeatureNode.java:29)
		at org.spockframework.runtime.PlatformSpecRunner.lambda$createMethodInfoForDoRunFeature$4(PlatformSpecRunner.java:202)
		at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:136)
		at org.spockframework.runtime.PlatformSpecRunner.invokeRaw(PlatformSpecRunner.java:406)
		at org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:389)
		at org.spockframework.runtime.PlatformSpecRunner.runFeature(PlatformSpecRunner.java:195)
		at org.spockframework.runtime.FeatureNode.around(FeatureNode.java:29)
		at org.spockframework.runtime.SimpleFeatureNode.around(SimpleFeatureNode.java:52)
		at org.spockframework.runtime.SimpleFeatureNode.around(SimpleFeatureNode.java:15)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
		at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
		at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
		at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
		at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
		at org.spockframework.runtime.SpockNode.sneakyInvoke(SpockNode.java:40)
		at org.spockframework.runtime.SpecNode.lambda$around$0(SpecNode.java:63)
		at org.spockframework.runtime.PlatformSpecRunner.lambda$createMethodInfoForDoRunSpec$0(PlatformSpecRunner.java:62)
		at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:136)
		at org.spockframework.runtime.PlatformSpecRunner.invokeRaw(PlatformSpecRunner.java:406)
		at org.spockframework.runtime.PlatformSpecRunner.invoke(PlatformSpecRunner.java:389)
		at org.spockframework.runtime.PlatformSpecRunner.runSpec(PlatformSpecRunner.java:56)
		at org.spockframework.runtime.SpecNode.around(SpecNode.java:63)
		at org.spockframework.runtime.SpecNode.around(SpecNode.java:11)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
		at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
		at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
		at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
		at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
		at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
		at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
		at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
		at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
		at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
		at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
		at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
		at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
		at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
		at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
		at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
		at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
		at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
		at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
		at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
		at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
		at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
		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:566)
		at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
		at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
		at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
		at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
		at com.sun.proxy.$Proxy2.stop(Unknown Source)
		at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:135)
		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:566)
		at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
		at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
		at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
		at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
		at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
		at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
		at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
		at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
		at java.base/java.lang.Thread.run(Thread.java:834)

Build scan: https://gradle.com/s/con7n2u67jwqw (note it doesn't show the suppressed exception that contains the pointer to cleanup).

Additional Environment information

------------------------------------------------------------
Gradle 7.0
------------------------------------------------------------

Build time:   2021-04-09 22:27:31 UTC
Revision:     d5661e3f0e07a8caff705f1badf79fb5df8022c4

Kotlin:       1.4.31
Groovy:       3.0.7
Ant:          Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM:          11.0.10 (AdoptOpenJDK 11.0.10+9)
OS:           Mac OS X 10.16 x86_64

Java/JDK

❯ java -version
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.10+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.10+9, mixed mode)

Groovy version

The project uses Groovy 3.0.8, see https://github.com/britter/gradle-sandbox/blob/d4f0ad998e1c28c2b90b4676ac6a1cbe844baac1/spock-fields-methods/build.gradle.kts#L10

@britter britter changed the title Problem when calling a method in a base spec and assigning the return value to a variable of the same name Problem when calling a method from a base spec and assigning the return value to a variable of the same name Apr 23, 2021
@leonard84
Copy link
Member

leonard84 commented Apr 23, 2021

This is the same issue as in #1266 only that here cleanup: is the cause. You actually don't need to have a BaseSpec for this.

class SimpleSpecification extends BaseSpecification {

    def "simple test"() {
        given:
        def foo = foo("foo")
        def bar = "bar"

        when:
        foo.toString()

        then:
        assert bar != null

        cleanup:
        bar.length()
    }
}

leonard84 referenced this issue in leonard84/spock Apr 23, 2021
in features with cleanup blocks or using thrown condition

fixes #1266, fixes #1313
leonard84 added a commit that referenced this issue Apr 23, 2021
…1314)

in features with cleanup blocks or using thrown condition

fixes #1266, fixes #1313
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants