如何编译使用hamcrest'的'Kotlin单元测试代码'是'

the*_*man 23 junit unit-testing hamcrest kotlin

我想为我的Kotlin代码编写单元测试并使用junit/hamcrest匹配器,我想使用该is方法,但它是Kotlin中的保留字.

如何编译以下内容?

class testExample{
  @Test fun example(){
    assertThat(1, is(equalTo(1))
  }
}
Run Code Online (Sandbox Code Playgroud)

目前我的IDE,InteliJ强调,作为一个编译错误,说它期待一个)is

the*_*man 34

在Kotlin,is是一个保留词.要解决此问题,您需要使用反引号来转义代码,因此以下内容将允许您编译代码:

class testExample{
  @Test fun example(){
    assertThat(1, `is`(equalTo(1))
  }
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*oko 33

使用关键字导入时,可以使用别名is(比如说Is)as.

例如:

 import org.hamcrest.CoreMatchers.`is` as Is
Run Code Online (Sandbox Code Playgroud)

请参阅https://kotlinlang.org/docs/reference/packages.html

  • 在导入它时你仍然需要引用`is`函数,所以你仍然需要转义它.但这是一个很好的技巧,可以帮助您避免在整个地方逃离它. (3认同)

naX*_*aXa 8

正如其他人指出的那样,在 Kotlin 中,is是一个保留字(参见类型检查)。但这对 Hamcrest 来说不是大问题,因为is函数只是一个装饰器。它用于提高代码可读性,但不是正常运行所必需的。

您可以自由使用较短的 Kotlin 友好表达式。

  1. 平等:

    assertThat(cheese, equalTo(smelly))
    
    Run Code Online (Sandbox Code Playgroud)

    代替:

    assertThat(cheese, `is`(equalTo(smelly)))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 匹配器装饰器:

    assertThat(cheeseBasket, empty())
    
    Run Code Online (Sandbox Code Playgroud)

    代替:

    assertThat(cheeseBasket, `is`(empty()))
    
    Run Code Online (Sandbox Code Playgroud)

另一个常用的 Hamcrest 匹配器是类型检查,如

assertThat(cheese, `is`(Cheddar.class))
Run Code Online (Sandbox Code Playgroud)

它已被弃用,并且对 Kotlin 不友好。相反,建议您使用以下方法之一:

assertThat(cheese, isA(Cheddar.class))
assertThat(cheese, instanceOf(Cheddar.class))
Run Code Online (Sandbox Code Playgroud)