Back-End (web)

[JUnit5] @ParameterizedTest

햄과함께 2019. 12. 15. 20:47
320x100

@ParameterizedTest 어노테이션은 테스트 함수에 파라미터로 TC나 결과 등을 주입할 수 있다.

 

// build.gradle.kts
dependencies {
  // add
  testImplementation("org.junit.jupiter:junit-jupiter-params:5.5.2")
}

의존성추가

 

private fun String?.toIntOrNull(): Int? {
  return if (this.isNullOrEmpty()) null
  else try {
    this.toInt()
  } catch (e: NumberFormatException) {
    null
  }
}

테스트를 위와 같은 확장 함수를 하나 만들었다.

문자열이 null이거나 빈 경우 null을 반환하고 아닌 경우 문자열을 Int로 바꾸는 함수이다.

문자열이 Int형 포맷과 맞지 않은 경우도 exception을 잡아서 null을 반환하게 했다.

 

companion object {
  // #2
  @JvmStatic
  private fun stringToLocalDateTimeTestCase() = Stream.of(
      Arguments.of(-1, "-1"),
      Arguments.of(0, "0"),
      Arguments.of(1, "1")
  )
}

// #1
@ParameterizedTest
@MethodSource("stringToLocalDateTimeTestCase")
fun convertToLocalDateTime_successTest(expected: Int, str: String) {
  assertEquals(expected, str.toIntOrNull())
}

// #3
@ParameterizedTest
@ValueSource(strings = ["ab", "csd", "12!"])
@NullAndEmptySource
fun convertToLocalDateTime_nullTest(str: String?) {
  assertNull(str.toIntOrNull())
}

 #1  @MethodSource 어노테이션은 파라미터를 반환하는 함수이름을 명시해주어야 한다.

 #2  @MethodSource 어노테이션에 주입할 파라미터를 반환하는 함수는 Stream<Arguments> 타입을 반환해준다. 그리고 static 함수여야 하므로 코틀린에서는 companion object안에 함수 정의를 해주고 @JvmStatic 어노테이션을 명시해줘야 한다.

 #3  @NullAndEmptySource 어노테이션은 @NullSource, @EmptySource 2개를 합친 어노테이션이다.

파라미터에 null과 empty source를 주입해준다. 문자열에서는 null, ""가 주입된다.

320x100