Kotlin тесты: условно утверждать исключения броска в параметризованных тестах - PullRequest
0 голосов
/ 23 января 2020

Я бы хотел написать параметризованный тест в Kotlin. В зависимости от входных параметров, тестируемая функция должна выдавать пользовательское исключение или она должна завершиться успешно, если все в порядке. Я использую JUnit Jupiter 5.3.2.

Это упрощенная версия того, что у меня сейчас (на самом деле есть несколько входных параметров). Это работает, но это немного уродливо, так как мне нужно дважды включить вызов протестированного метода:

companion object {
      @JvmStatic
      fun paramSource(): Stream<Arguments> = Stream.of(
            Arguments.of(1, true),
            Arguments.of(2, false),
            Arguments.of(3, true)
      )
}

@ParameterizedTest
@MethodSource("paramSource")
open fun testMyServiceMethod(param: Int, shouldThrow: Boolean) {

      if (!shouldThrow) {
          // here the exception should not be thrown, so test will fail if it will be thrown
          myService.myMethodThrowingException(param)
      } else {
          assertThrows<MyCustomException>{
              myService.myMethodThrowingException(param)
          }
      }
}

Есть ли лучший подход к этому?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Как отметил Нео, это не очень хорошая идея. Правильным решением в этом случае будет создание двух отдельных тестов - по одному на каждый случай исходного теста.

Тесты должны включать как можно меньше логи c. Они должны быть простыми и понятными.

0 голосов
/ 23 января 2020

Вы можете легко инкапсулировать это:

inline fun <reified E : Exception> assertThrowsIf(shouldThrow: Boolean, block: () -> Unit) {
    if (!shouldThrow) {
        block()
    } else {
        assertThrows<E>(block)
    }
}

Использование:

@ParameterizedTest
@MethodSource("paramSource")
open fun testMyServiceMethod(param: Int, shouldThrow: Boolean) {
    assertThrowsIf<MyCustomException>(shouldThrow) {
        myService.myMethodThrowingException(param)
    }
}
...