我正在尝试使用Groovy中的Spock测试我的Kotlin代码,该代码具有Arrow-kt类型。但是,我无法使用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中使用它。
答案 0 :(得分:1)
是的,您可以在Groovy
中使用Arrow Datatypes,其结果并不像Kotlin
中那样惯用,因为该库在很大程度上取决于扩展功能和{{1}中的功能}
示例
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
)