Как скомпилировать код модульного теста Kotlin, который использует hamcrest 'is'

Я хочу написать модульный тест для моего кода Kotlin и использовать сопоставители junit / hamcrest, я хочу использовать метод is, но это зарезервированное слово в Kotlin.

Как я могу скомпилировать следующее?

class testExample{
  @Test fun example(){
    assertThat(1, is(equalTo(1))
  }
}

В настоящее время моя IDE, InteliJ, выделяет это как ошибку компиляции, говоря, что ожидает ) после is?


person thecoshman    schedule 13.10.2016    source источник


Ответы (3)


Вы можете присвоить is псевдониму Is (например) при импорте, используя ключевое слово as.

E.g:

 import org.hamcrest.CoreMatchers.`is` as Is

См. https://kotlinlang.org/docs/reference/packages.html

person David Soroko    schedule 14.10.2016
comment
Вам все равно нужно будет ссылаться на функцию is при ее импорте, поэтому вам все равно нужно будет ее избежать. Но это хороший трюк, который поможет спасти вас от повсеместного побега. - person thecoshman; 14.10.2016
comment
Это правда, только один раз, что-то вроде: import org.hamcrest.CoreMatchers.is as Is - person David Soroko; 14.10.2016
comment
В этом случае это просто стиль. Лично я предпочитаю избегать имени функции лично. - person thecoshman; 14.10.2016
comment
Вам решать. С псевдонимом вам нужно это сделать только один раз - person David Soroko; 14.10.2016

В Котлине is - зарезервированное слово. Чтобы обойти это, вам нужно экранировать код, используя обратные кавычки, поэтому следующее позволит вам скомпилировать код:

class testExample{
  @Test fun example(){
    assertThat(1, `is`(equalTo(1))
  }
}
person thecoshman    schedule 13.10.2016
comment
Возможно, вы сможете использовать инфиксный оператор, возможно, чтобы разрешить _1 _..., но я думаю, вам придется обернуть хороший бит. Может быть, комбинируя некоторые работы в стиле DSL, вы дойдете до того, что можно написать assertThat{ N isEqualTo 1}, но я не склонен прилагать такие усилия ... пока - person thecoshman; 09.10.2017

Как указывали другие, в Котлине is - зарезервированное слово (см. Проверка типов). Но с Hamcrest это не большая проблема, поскольку функция is просто декоратор. Он используется для лучшей читаемости кода, но не требуется для правильной работы.

Вы можете использовать более короткое, удобное для Kotlin выражение.

  1. равенство:

    assertThat(cheese, equalTo(smelly))
    

    вместо:

    assertThat(cheese, `is`(equalTo(smelly)))
    
  2. декоратор сопоставления:

    assertThat(cheeseBasket, empty())
    

    вместо:

    assertThat(cheeseBasket, `is`(empty()))
    

Другим часто используемым средством сопоставления Hamcrest является проверка типа, например

assertThat(cheese, `is`(Cheddar.class))

Он устарел и не подходит для Котлина. Вместо этого вам рекомендуется использовать одно из следующих:

assertThat(cheese, isA(Cheddar.class))
assertThat(cheese, instanceOf(Cheddar.class))
person naXa    schedule 20.03.2019
comment
О, это на самом деле очень приятно знать. Никогда не знал, что это был лишний звонок. - person thecoshman; 21.03.2019