Testing Kotlin测试:在参数化测试中有条件地断言抛出异常
我想用Kotlin写一个参数化测试。根据输入参数,被测试函数应该抛出自定义异常,或者如果一切正常,它应该成功。我正在使用JUnitJupiter 5.3.2 这是我现在的简化版本,实际上有多个输入参数。它可以工作,但感觉有点难看,因为我需要包含两次测试方法调用:Testing Kotlin测试:在参数化测试中有条件地断言抛出异常,testing,kotlin,syntax,junit5,Testing,Kotlin,Syntax,Junit5,我想用Kotlin写一个参数化测试。根据输入参数,被测试函数应该抛出自定义异常,或者如果一切正常,它应该成功。我正在使用JUnitJupiter 5.3.2 这是我现在的简化版本,实际上有多个输入参数。它可以工作,但感觉有点难看,因为我需要包含两次测试方法调用: companion object { @JvmStatic fun paramSource(): Stream<Arguments> = Stream.of( Argument
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)
}
}
}
有什么更好的方法吗?您可以很容易地将其封装:
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)
}
}
正如尼奥所指出的,这不是一个好主意。在这种情况下,正确的解决方案是创建两个单独的测试——一个用于原始测试的每个案例
测试应该包含尽可能少的逻辑。它们应该简单明了 1此帖子应移至codereview.stackexchange,因为它是一个工作代码,您需要改进。2在单元测试中有条件行为是一种不好的模式。如果需要两个案例,请定义两个参数化测试。3单元测试不检查是否没有抛出异常,这是一种糟糕的方法。