Использование assertThrows из JUnit5 в Groovy - PullRequest
1 голос
/ 03 июля 2019

При использовании Java и assertThrows:

public static <T extends Throwable> T assertThrows(Class<T> expectedType, Executable executable)

мы можем написать простую лямбда-функцию:

@Test
void testExpectedException() {

  Assertions.assertThrows(NumberFormatException.class, () -> {
    Integer.parseInt("One");
  });

}

Как мы можем сделать это в Groovy?

Я пытался что-то вроде:

@Test
void testExpectedException() {

  assertThrows(NumberFormatException.class, {
    Integer.parseInt("One");
  }())

}

но ошибка выдается и не отлавливается:

java.lang.format.NumberFormatException: For ....

1 Ответ

2 голосов
/ 03 июля 2019

В вашем методе тестирования есть одна ошибка. Вместо приведения замыкания к типу Executable вы передали результат вызова замыкания. Правильный синтаксис:

@Test
void testExpectedException() {
  assertThrows(NumberFormatException.class, {
    Integer.parseInt("One");
  })
}

Вы можете сделать его еще более "отличным" с помощью:

@Test
void testExpectedException() {
  assertThrows(NumberFormatException) {
    Integer.parseInt("One")
  }
}

Во втором примере используется популярная идиома Groovy - когда последний параметр метода является замыканием, вы можете поместить его за скобки. Он выглядит как блок кода, но это просто замыкание, переданное методу в качестве второго параметра.

В примере с Java вы использовали лямбда-выражение, переданное в качестве экземпляра Executable функционального интерфейса. Для этого Groovy-эквивалент (по крайней мере, в версии Groovy 2.x - добавлена ​​поддержка лямбда-выражений в Groovy 3) - приведение замыкания к типу SAM (единственный абстрактный метод). В приведенном выше примере показано, как определить экземпляр типа Executable с замыканием. Если вы поставите () после закрывающей скобки закрытия, вы сделаете ярлык для выполнения метода call(). Этот метод выполняет тело замыкания.

...