Как я могу использовать Arrow-kt Some () в коде Groovy? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь протестировать мой код 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 Ответ

0 голосов
/ 15 января 2019

Да, вы можете использовать Arrow Типы данных в 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 или нет)

...