什么是Java相当于Kotlin的函数types?
我有Kotlin
代码和Java
测试代码。 由于Kotlin
和Mockito
不是最好的朋友,所以我没有将测试代码迁移到Kotlin
。
在Kotlin
我有块types的方法。 例如:
open fun getProductInfo(resultListener: (List)->Unit, errorListener: (Throwable)->Unit) { ... }
现在我想在Java
测试中存储这个方法。 什么是types的Java相当于什么? 换句话说,我应该写下面的代码:
doAnswer(invocation -> { ??? resultListener = (???) invocation.getArguments()[0]; // call back resultListener return null; }).when(api).getProductInfo(any(), any());
从Kotlin in Action书中:
Kotlin标准库定义了一系列接口,对应于不同数量的函数参数:
Function0
(该函数不带参数),Function1
(该函数带一个参数)等等。 每个接口定义一个invoke方法,调用它将执行该函数。
在这种情况下,这两个函数都是Function1
实例,因为它们是带有一个参数的函数:
Mockito.doAnswer(invocation -> { Function1, Unit> resultListener = (Function1, Unit>) invocation.getArguments()[0]; Function1 errorListener = (Function1) invocation.getArguments()[1]; resultListener.invoke(new ArrayList<>()); return null; }).when(api).getProductInfo(any(), any());
另外,你可以尝试mockito-kotlin和Mockito的内联版本 ,以便在Kotlin中编写测试。
为什么不尝试在Android Studio或IntelliJ中获取Kotlin的Java代码:
- 菜单 – >工具 – > Kotlin – >显示Kotlin字节码
- 点击 – >反编译按钮
- 复制Java代码
这样你就可以继续使用Mockito,不幸的是你会得到冗余的代码行(不是很多),因为Kotlin处理字节码。