假设我在Kotlin的JUnit测试中有以下代码:

sealed class InvalidField(val value: String): Exception()
data class InvalidName(val name: String): InvalidField(name)
data class InvalidEmail(val email: String): InvalidField(email)
data class InvalidPassword(val password: String): InvalidField(password)

data class TestCase(exceptionType: WHAT_IS_HERE)

fun `test cases of all exceptions`() = setOf(
   // create instances of TestCases with each exception. how?
)

@ParameterizedTest
@MethodSource("test cases of all exceptions")
fun `test invalid name`(testCase: TestCase) {
   // how can I access the testCase.exceptionType from here?
}
WHAT_IS_HERE的约束应该是 exceptionType类引用应继承自InvalidField
我知道仿制药可能是答案。但是如何?请注意,我想在TestCase而不是其实例中传递类引用。

我该如何解决?

最佳答案

首先,有一些更正,因为此代码无法编译。 sealed类不能是data class,这根本没有意义。
另外,您不必将数据类嵌套在sealed类中,这只是样式设置。
另外,数据类至少需要一个成员,而您没有指定任何成员。因此,假设这是您得到的代码:

sealed class InvalidField(val value: String): Exception()
data class InvalidName(val name: String): InvalidField(name)
data class InvalidEmail(val email: String): InvalidField(email)
data class InvalidPassword(val password: String): InvalidField(password)

现在,假设您的TestCase只需要接受InvalidField的子代:
data class TestCase<out T : InvalidField>(val exceptionType: T)

然后您的测试将如下所示:
class MyTest {
    @ParameterizedTest
    @MethodSource("cases")
    fun `test invalid name`(testCase: TestCase<InvalidField>) {
        // Any TestCase has exceptionType
        println(testCase.exceptionType)
    }

    companion object {
        @JvmStatic
        fun cases() = setOf<TestCase<InvalidField>>(
            TestCase(InvalidName("abc"))
        )
    }
}

10-04 13:59