【问题标题】:What does `when` mean inside ` ` in Kotlin?在 Kotlin 中,`when` 是什么意思?
【发布时间】:2018-08-22 19:05:05
【问题描述】:

我在用 Kotlin 创建的 Android 单元测试中看到这样的代码

`when`(context.getSharedPreferences(anyString(), anyInt())).thenReturn(sharedPreferences)

你能解释一下为什么when在里面吗?如果我删除 when 周围的 `` 我会看到 thenReturn 无法解决的问题。

【问题讨论】:

    标签: unit-testing kotlin mockito


    【解决方案1】:

    when 是 Kotlin 中的关键字,因为它在 when expression 中使用。在 Mockito 中,有一个静态函数,也称为 when。发生这种情况是因为 when 在 Java 中不是关键字,因此它可用于标识符命名。

    反引号是 special syntax,这使得这些用 Java 定义的函数仍然可以从 Kotlin 调用。

    附言。您可能想查看 mockito-kotlin,它使 Kotlin 中的几个与 Mockito 相关的任务变得更简单,例如,它将 when 函数重命名为 whenever,以便更容易和更好地调用。

    【讨论】:

    • The backticks are special syntax that make these functions defined in Java still callable from Kotlin. - 不仅如此。也可以在 Kotlin 中调用它们来转义通常的非法字符。例如,** 不会编译,但 `**` 可以。虽然使用非保留关键字和支持的名称通常更容易,但在某些情况下可以在函数声明中使用反引号(即fun `**`(something: Any)
    【解决方案2】:

    如果您不想按照接受的答案中的建议依赖另一个第三方库,您可能需要查看BDDMockito(已经是 Mockito 的一部分)。这基本上只是改变了您使用 Mockito 编写测试的风格,并且恰好提供了对 Kotlin 友好的函数名称,不需要像 when 那样进行转义:

    //Given
    given(calcService.add(20.0,10.0)).willReturn(30.0);
    
    //when
    double result = calcService.add(20.0,10.0);
    
    //then
    Assert.assertEquals(result,30.0,0); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多