Как я могу использовать Arrow-kt Some() в коде Groovy?
Я пытаюсь протестировать мой код Kotlin, который имеет типы Arrow-kt, используя Spock в Groovy. Тем не менее, я не могу использовать дополнения Arrow-KT, такие как Some
, Например, у меня есть тест следующим образом:
@Unroll
def "add returns #expected for queryRecord #queryRecord"() {
given:
def ip = "ip"
def rule = "rule"
when:
def result = unit.add(ip, rule)
then:
1 * dynamoDBMapperMock.load(ActionRecord.class, ip) >> queryRecord
result == expected
where:
queryRecord | expected
new ActionRecord() | None.INSTANCE
null | Some(new ActionInternal("ip"))
}
В то время как первая строка данных проходит без проблем, вторая - со следующей ошибкой:
groovy.lang.MissingMethodException: No signature of method: package.name.EventSpec.Some() is applicable for argument types: (package.name.ActionInternal) values: [ActionInternal(dropletIp=null)]
Possible solutions: Mock(), Spy(), Stub(), dump(), Mock(groovy.lang.Closure), Mock(java.lang.Class)
я пробовал .some()
как хорошо, но безрезультатно. Очевидно, Groovy не может получить доступ к расширениям Kotlin, но Some
это просто класс данных [ 1], поэтому я не уверен, почему я не могу использовать его в Groovy.
1 ответ
Да, вы можете использовать Arrow Datatypes в Groovy
, результат не так идиоматичен, как в Kotlin
потому что библиотека сильно зависит от функций расширения и функций в companion object
пример
import arrow.core.Option
import static arrow.core.OptionKt.getOrElse
static main(args){
println 'What is your name?'
def name = Option.@Companion.fromNullable(System.in.newReader().readLine())
.filterNot { it.isEmpty() }
.map { it.toUpperCase() }
println("Welcome ${getOrElse(name) { 'Anonymous' }}")
}
Выход
'Welcome JOHN' (or 'Welcome Anonymous' if the provided name is null or empty)
Как видите, чтобы можно было использовать getOrElse
функция расширения, нам нужно импортировать ее как статический метод
намек
Не использовать Some
непосредственно, если вы не уверены, что значение не null
в противном случае вы должны полагаться на Option.fromNullable
безопасно поднять значение до Option
контекст (т.е. создать Some
или же None
в зависимости от значения null
или нет)