【问题标题】:What is java equivalent of Kotlin's Function Types?什么是 Kotlin 的函数类型的 java 等价物?
【发布时间】:2017-11-01 08:16:50
【问题描述】:

我在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());

【问题讨论】:

    标签: java mocking mockito kotlin


    【解决方案1】:

    来自Kotlin in Action 书:

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

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

    【讨论】:

    • 谢谢,就是这样:)
    【解决方案2】:

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

    • 菜单 -> 工具 -> Kotlin -> 显示 Kotlin 字节码
    • 点击->反编译按钮
    • 复制 Java 代码

    这样你就可以继续你的 Mockito 工作,不幸的是你会得到多余的代码行(不多),因为 Kotlin 处理字节码。

    【讨论】:

    • 谢谢,我不知道这个有用的功能:)
    猜你喜欢
    • 2016-04-10
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2019-12-26
    相关资源
    最近更新 更多