什么是Java等效的Kotlin的函数类型?

时间:2017-11-01 08:16:51

标签: java mocking mockito kotlin

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

来自Kotlin in Action书:

  

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

在这种情况下,这两个函数都是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的inline version来在Kotlin中编写测试。

答案 1 :(得分:1)

为什么不尝试Android Studio或IntelliJ,从Kotlin获取Java代码:

  • 菜单 - &gt;工具 - &gt; Kotlin - &gt;显示Kotlin Bytecode
  • 点击 - &gt;反编译按钮
  • 复制Java代码

通过这种方式,您可以继续使用Mockito工作,不幸的是,您将获得冗余的代码行(不多),因为Kotlin处理字节码。