假设我在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"))
)
}
}