如何在Kotlin中使用MethodSource编写嵌套参数化测试



我正在学习如何用JUnit 5在Kotlin中编写测试。在编写Java时,我喜欢使用@Nested@ParametrizedTest@MethodSource等功能。但当我切换到Kotlin时,我遇到了一个问题:

我学会了如何使用

  • @Nested通过引用嵌套Kotlin类中的此JUnit测试运行gradle测试时未找到
  • @ParametrizedTest@MethodSource,参见Kotlin Developers的JUnit 5-第4.2节

但当我把这些放在一起时,我得到了

此处不允许使用Companion对象。

内部类内部的


测试以再现错误

internal class SolutionTest {
@Nested
inner class NestedTest {
@ParameterizedTest
@MethodSource("testCases")
fun given_input_should_return_expected(input: Int, expected: Int) {
// assert
}
// error in below line
companion object {
@JvmStatic
fun testCases(): List<Arguments> {
return emptyList()
}
}
}
}

有可能解决这个错误吗?那么我可以一起使用@Nested@ParametrizedTest@MethodSource吗?

您可以使用外部类的完全限定名称来指定方法@MethodSource("com.example.SolutionTest#testCases")

下面是一个嵌套测试的示例。

package com.example
// imports
internal class SolutionTest {
@Test
fun outerTest() {
// ...
}
@Nested
inner class NestedTest {
@ParameterizedTest
@MethodSource("com.example.SolutionTest#testCases")
fun given_input_should_return_expected(input: Int, expected: Int) {
Assertions.assertEquals(input + 2, expected)
}
}
companion object {
@JvmStatic
fun testCases(): List<Arguments> {
return listOf(
Arguments.of(1, 3),
Arguments.of(2, 4),
)
}
}
}

如果您不介意使用@TestInstance(PER_CLASS),那么您可以像普通Kotlin方法一样定义MethodSource方法,而不需要配套对象:

internal class SolutionTest {
@Nested
@TestInstance(PER_CLASS)
inner class NestedTest {
@ParameterizedTest
@MethodSource("testCases")
fun given_input_should_return_expected(input: Int, expected: Int) {
// assert
}
fun testCases(): List<Arguments> {
return emptyList()
}
}
}

相关内容

  • 没有找到相关文章

最新更新