我有办法
fun getUser(userId: UserId): Optional<User?> = userRepository.findById(userId)
在java中返回一个可选的。所以我想在我的kotlin单元测试中模拟这个方法调用。
这是我的第一个猜测。。。
given { mockedUserService.getUser(currentUser.userId) }.willReturn(Optional.of(currentUser))
... 但是编译器说不行
类型不匹配:推断类型是可选的,但可选<user?>!是意料之中的
所以我开始做 val currentUser: User?
只是为了让编译器高兴。
given { currentUser?.userId?.let { mockedUserService.getUser(it) }.willReturn(Optional.of(currentUser))
类型不匹配:推断类型是可选的,但可选<user?>?是意料之中的
类型不匹配:推断的类型是用户?但是typevariable(t)是预期的
现在我有点迷路了。我怎样才能使编译器高兴呢?
3条答案
按热度按时间kgsdhlau1#
将此视为一种替代方案。我假设您使用的是java的类型
Optional
而不是您自己的实现(做的比我在这里看到的更多)。这个
Optional
来到java是为了避免出现npe,并在运行时指出某个类型的缺席。但是在kotlin中,您实际上不需要可选的,因为您可以显式地将您的类型定义为nullableT?
.因此您可以将其定义为:
或
tyky79it2#
您可以尝试willanswer而不是willreturn:
8ehkhllq3#
一种方法是修复测试,但这实际上不是问题所在。你应该避免
Optional
尽可能在Kotlin。java的类型系统无法区分可空值和不可空值。kotlin有,所以你应该改变Optional<T>
尽可能早地T?
.您可以这样轻松地修复您的函数: