шпунтовая распечатка стека трассировки, хотя исключение ловится - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть тест спока, который вызывает какую-то службу:

when:
def x = service.call()

then:
!x

Внутри службы у меня есть:

def call() {
  try {
    doCall() // method, which throws an exception
  } catch (e) {
    false
  }
}

Итак, я ожидаю, что метод вернет false и тест пройден. Однако тестовый вызов из IDE печатает трассировку стека исключительной ситуации, хотя она перехватывается.

Цель теста - не узнать, было ли выброшено исключение, а просто подтвердить, что возвращенный результат ложен, поэтому я не хочу использовать Specification.thrown

1 Ответ

0 голосов
/ 07 ноября 2018

Прежде всего - проверьте, какое конкретное исключение выдается и выходит за пределы блока try-catch. Вы должны знать, что следующий код в Groovy:

try {
   // do something
} catch (e) {
   // do something with exception
}

является эквивалентом:

try {
   // do something
} catch (Exception e) {
   // do something with exception
}

Это означает, что java.lang.Throwable и все его дочерние классы (кроме java.lang.Exception) не перехвачены в вашем try catch. Например:

def call() {
    try {
        throw new Error('Something wrong happened')
    } catch (e) {
        false
    }
}

Это исключение не будет поймано try-catch, и вы увидите что-то подобное в журнале консоли:

java.lang.Error: Something wrong happened

    at com.github.wololock.micronaut.TestSpec$Service.call(TestSpec.groovy:22)
    at com.github.wololock.micronaut.TestSpec.test(TestSpec.groovy:13)

Это происходит потому, что java.lang.Error расширяет java.lang.Throwable и это не дочерний класс java.lang.Exception.

Если вы хотите перехватить все возможные исключения, которые могут случиться с вашим кодом, вам придется использовать Throwable внутри блока catch, что-то вроде этого:

def call() {
    try {
        throw new Error('Something wrong happened')
    } catch (Throwable e) {
        false
    }
}
...