不能在kotlin中用optional模拟“willreturn”

rekjcdws  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(334)

我有办法

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)是预期的
现在我有点迷路了。我怎样才能使编译器高兴呢?

kgsdhlau

kgsdhlau1#

将此视为一种替代方案。我假设您使用的是java的类型 Optional 而不是您自己的实现(做的比我在这里看到的更多)。
这个 Optional 来到java是为了避免出现npe,并在运行时指出某个类型的缺席。但是在kotlin中,您实际上不需要可选的,因为您可以显式地将您的类型定义为nullable T? .
因此您可以将其定义为:

fun getUser(userId: UserId): User?

fun getUser(userId: UserId): Optional<User> // not nullable!
tyky79it

tyky79it2#

您可以尝试willanswer而不是willreturn:

given { mockedUserService.getUser(currentUser.userId) }.willAnswer { Optional.of(currentUser) }
8ehkhllq

8ehkhllq3#

一种方法是修复测试,但这实际上不是问题所在。你应该避免 Optional 尽可能在Kotlin。java的类型系统无法区分可空值和不可空值。kotlin有,所以你应该改变 Optional<T> 尽可能早地 T? .
您可以这样轻松地修复您的函数:

fun getUser(userId: UserId): User? = userRepository.findById(userId).orElse(null)

相关问题