什么是 Java 等价于 Kotlin 的函数类型



我在Kotlin中有代码,在Java中测试代码。由于KotlinMockito不是最好的朋友,所以我没有将测试代码迁移到Kotlin

Kotlin我有块类型的方法。例如:

open fun getProductInfo(resultListener: (List<Deal>)->Unit, errorListener: (Throwable)->Unit)
{
    ...
}

现在我想在Java测试中存根此方法。这些类型的 java 等价物是什么?换句话说,我应该写什么来代替???s 如下:

doAnswer(invocation -> {
    ??? resultListener = (???) invocation.getArguments()[0];
    // call back resultListener
    return null;
}).when(api).getProductInfo(any(), any());

摘自 Kotlin in Action 一书:

Kotlin 标准库定义了一系列接口,对应于不同数量的函数参数:Function0<R>(此函数不带参数)、Function1<P1, R>(此函数带一个参数)等。每个接口定义一个调用方法,调用它将执行该函数。

在这种情况下,这两个函数都是Function1实例,因为它们是采用一个参数的函数:

Mockito.doAnswer(invocation -> {
    Function1<List<Deal>, Unit> resultListener =
            (Function1<List<Deal>, Unit>) invocation.getArguments()[0];
    Function1<Throwable, Unit> errorListener =
            (Function1<Throwable, Unit>) 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 处理字节码。

相关内容

  • 没有找到相关文章

最新更新