![](/img/trans.png)
[英]Why Mockito can't mock a generic parameter type with number type in Kotlin?
[英]Can't mock `willReturn` with Optional in Kotlin
我有一个方法
fun getUser(userId: UserId): Optional<User?> = userRepository.findById(userId)
在 Java 中返回一个 Optional。 所以我想在我的 Kotlin 单元测试中模拟该方法调用。
这是我的第一个猜测...
given { mockedUserService.getUser(currentUser.userId) }.willReturn(Optional.of(currentUser))
...但编译器说不
类型不匹配:推断类型是 Optional 但 Optional<User?>! 预计
所以我开始制作val currentUser: User?
只是为了让编译器开心。
given { currentUser?.userId?.let { mockedUserService.getUser(it) }.willReturn(Optional.of(currentUser))
类型不匹配:推断类型是 Optional 但 Optional<User?>? 预计
类型不匹配:推断类型是用户? 但 TypeVariable(T) 是预期的
现在我有点迷失了。 我怎样才能让编译器满意?
将此视为替代方案。 我假设您使用的是 Java 的类型Optional
而不是您自己的实现(比我在这里看到的更多)。
Optional
来到 Java 以避免 NPE 并在运行时指示类型的缺失。 但是在 Kotlin 中,您并不需要 Optional,因为您可以明确地将您的类型定义为可为空的T?
.
因此,您可以将其定义为:
fun getUser(userId: UserId): User?
或者
fun getUser(userId: UserId): Optional<User> // not nullable!
您可以尝试willAnswer而不是willReturn :
given { mockedUserService.getUser(currentUser.userId) }.willAnswer { Optional.of(currentUser) }
一种方法是修复测试,但这实际上不是这里的问题。 您应该尽可能避免在 Kotlin 中使用Optional
。 Java 的类型系统无法区分可空值和不可空值。 Kotlin 可以,所以您应该尽早将Optional<T>
转换为T?
.
您可以像这样轻松修复 function:
fun getUser(userId: UserId): User? = userRepository.findById(userId).orElse(null)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.