spockframework / spockframework/spock
Mocking: Variables of Closure type aren't evaluated as code args
Open
Nobody has claimed this yet.
component:docs
help wanted
- Dominant language
- Java
- Stars
- 3.6k
- Forks
- 483
- PR merge metrics
- No merged PRs in 30d
Description
def beatIt = {
def result = (it >= now)
Thread.sleep(1)
now = System.currentTimeMillis()
return result
}
when:
task.execute(context)
then:
1 * loggingService.startJob(job, _, beatIt) >> jobExec // doesn't work
1 * loggingService.startJob(job, _, { beatIt(it) }) >> jobExec // works
Example is from one of my tests, where I discovered it.
From what I can tell, it is related to how you decide what is a code argument in the InteractionRewriter.addArg method. Maybe try also inspecting any VariableExpressions for closure type?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at InteractionRewriter.addArg and trace how closure arguments are classified, including VariableExpressions whose type is Closure. Use the two shown interaction forms as regression cases and verify that passing a closure variable evaluates it as a code argument just like the inline closure form.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- groovy, java
- Domain
- testing
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100