繁体   English   中英

无法在 Kotlin 中使用 Optional 模拟`willReturn`

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM