У меня есть этот код в Споке:
then:
1 * dao.getByValue(Something.ONE, _ as String) >> {Something smth, String value ->
return createSomething(smth).withValue(value).build()
}
Это не совсем так, но вы поняли. Я хочу вернуть объект на основе аргументов, переданных методу, в реальной версии этот объект загружается из базы данных.
Дело в том, что у меня есть этот звонок во многих местах, и он везде выглядит одинаково. Могу ли я как-нибудь извлечь это замыкание и использовать его везде, например так:
then:
1 * dao.getByValue(Something.ONE, _ as String) >> Closures.makeSomething
Я пытался использовать функцию извлечения Intellij, но там с типами это сходило с ума, после того, как я редактировал типы вручную, у меня были странные ошибки:
public static final Closure<Optional<Something>> makeSomething = { Something smth, String value ->
return createSomething(smth).withValue(value).build()
}
...
1 * dao.getByValue(Something.ONE, _ as String) >> makeSomething
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'mypackage.MySpec$__clinit__closure1@1757cd72' with class 'mypackage.MySpec$__clinit__closure1' to class 'java.util.Optional'
Даже тот не работал, и я думал, что это будет:
public static final Closure<Optional<Something>> makeSomething = { Something smth, String value ->
return createSomething(smth).withValue(value).build()
}
...
1 * dao.getByValue(Something.ONE, _ as String) >> {args -> makeSomething.call(args[0], args[1]) }
groovy.lang.MissingMethodException: No signature of method: mypackage.MySpec$__clinit__closure2.call() is applicable for argument types: (java.util.Arrays$ArrayList) values: [[mypackage.Something$$Lambda$6/1105423942@6f45df59, ...]]
Я не очень хорош в Groovy или Spock в общем, сейчас я просто пробую это.
Edit:
Рабочий код после предложения @tim_yates (все взаимодействие выполняется в вспомогательном методе):
then:
interaction {
somethingCall(2, Something.TWO)
somethingCall(3, Something.ONE)
}
}
private void somethingCall(int times, Something something) {
times * dao.getByValue(something, _ as String) >> { Something smth, String value ->
return createSomething(smth).withValue(value).build()
}
}
Неработающий код, который я хотел бы (во возвращающем методе есть только возвращаемое значение):
then:
2 * dao.getByValue(Something.TWO, _ as String) >> makeSomething
3 * dao.getByValue(Something.ONE, _ as String) >> makeSomething
}
public static final Closure<Optional<Something>> makeSomething = { Something smth, String value ->
return createSomething(smth).withValue(value).build()
}
Если я просто вставлю каждый >> makeSomething
и напишу там его тело, то оно будет работать.