Закрытие принимает аргумент, как указано it
, имеющим определенное значение. Это значение является соответствующим параметром метода. Поэтому независимо от того, какое замыкание вы определяете за пределами вашего взаимодействия, вы должны убедиться, что взаимодействие передает этот параметр закрытию, т.е. вам нужно создать собственное (маленькое и простое) закрытие, оценивающее внешнее (потенциально более длинное, более сложное) закрытие. с параметром it
:
1 * d.validate({ myClosureVar(it) }) >> true
Извините за повторение, но я всегда предпочитаю полный MCVE в моих ответах, чтобы вы могли легко копировать, вставлять, компилировать и запускать:
Классы приложений:
package de.scrum_master.stackoverflow.q60341734
class Doer {
boolean validate(int x) {
x == 2
}
}
package de.scrum_master.stackoverflow.q60341734
class Something {
Doer doer
Something(Doer doer) {
this.doer = doer
}
boolean doSth(x) {
if (!doer.validate(x)) throw new RuntimeException()
true
}
}
Спецификация Спока:
package de.scrum_master.stackoverflow.q60341734
import org.junit.Rule
import org.junit.rules.TestName
import spock.lang.Specification
class SomethingTest extends Specification {
@Rule
TestName testName
def "some test"() {
given:
def d = Mock(Doer)
def s = new Something(d)
when:
s.doSth(2)
then:
1 * d.validate({ println "$testName.methodName: closure parameter = $it"; it == 2 }) >> true
}
def "another test"() {
given:
def d = Mock(Doer)
def s = new Something(d)
def myClosureVar = { println "$testName.methodName: closure parameter = $it"; it == 2 }
when:
s.doSth(2)
then:
1 * d.validate({ myClosureVar(it) }) >> true
}
}
Журнал консоли:
some test: closure parameter = 2
another test: closure parameter = 2