如何在所有测试 类 中抑制 Kotlin 未使用参数警告?
How to suppress Kotlin unused parameter warning in all test classes?
在参数化测试中,我使用 hint
参数来阐明测试用例的命名。从静态分析器的角度来看,这个参数从未被使用过,所以来自 kotlin-maven-plugin
的这个警告出现在构建日志中:
[WARNING] /Users/test/TestSizeCreation.kt: (42, 10) Parameter 'hint' is never used
如何在所有测试中全局抑制此类警告?
带提示的测试示例:
@ParameterizedTest(name = "Size {index}: {0}")
@MethodSource("invalidAges")
fun shouldFailToCreateAge(hint: String, sizeCandidate: Int) {
assertThatThrownBy { Size(sizeCandidate) }
.isInstanceOf(InvalidInput::class.java)
.hasMessageStartingWith("Could not recognize a se: ")
}
companion object {
@JvmStatic
fun invalidAges(): Stream<Arguments> =
Stream.of(
arguments("negative", -5),
arguments("zero", 0),
arguments("too much", 1000)
)
}
两个可能的选项(可能还有更多):
首先是将参数注释为未使用,像这样:
@Suppress("UNUSED_PARAMETER")
在函数或参数级别。
第二种选择是在测试中使用 lambda 来执行实际代码,然后使用下划线忽略第一个参数,如下所示:
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.Arguments
import org.junit.jupiter.params.provider.Arguments.arguments
import org.junit.jupiter.params.provider.MethodSource
import java.util.stream.Stream
class Stack {
@ParameterizedTest(name = "Size {index}: {0}")
@MethodSource("invalidAges")
fun shouldFailToCreateAge(hint: String, sizeCandidate: Int) {
process(hint, sizeCandidate) { _, size ->
println("add your test using size here $size")
}
}
private fun process(hint: String, sizeCandidate: Int, block: (String, Int) -> Unit) {
block(hint, sizeCandidate)
}
companion object {
@JvmStatic
fun invalidAges(): Stream<Arguments> =
Stream.of(
arguments("negative", -5),
arguments("zero", 0),
arguments("too much", 1000)
)
}
}
我最终使用了这个仅在 src/test
上下文中引入的函数:
// this function used only to avoid "Parameter is never used" warning
// on intentionally unused parameters
fun Any?.touch() = Unit
这是它在测试方法中的样子:
@ParameterizedTest(name = "Size {index}: {0}")
@MethodSource("invalidAges")
fun shouldFailToCreateAge(hint: String, sizeCandidate: Int) {
hint.touch()
assertThatThrownBy { Size(sizeCandidate) }
.isInstanceOf(InvalidInput::class.java)
.hasMessageStartingWith("Could not recognize a se: ")
}
为什么:
@Suppress("UNUSED_PARAMETER")
严格用于极少数情况下的特殊情况。将它放在所有参数化测试中是不合适的,这会使其变得嘈杂。它还可能导致丢失未使用参数的实际情况,从而帮助出现垃圾代码。
touch
方法清楚地表明了意图。它看起来像一个最小的邪恶。
在参数化测试中,我使用 hint
参数来阐明测试用例的命名。从静态分析器的角度来看,这个参数从未被使用过,所以来自 kotlin-maven-plugin
的这个警告出现在构建日志中:
[WARNING] /Users/test/TestSizeCreation.kt: (42, 10) Parameter 'hint' is never used
如何在所有测试中全局抑制此类警告?
带提示的测试示例:
@ParameterizedTest(name = "Size {index}: {0}")
@MethodSource("invalidAges")
fun shouldFailToCreateAge(hint: String, sizeCandidate: Int) {
assertThatThrownBy { Size(sizeCandidate) }
.isInstanceOf(InvalidInput::class.java)
.hasMessageStartingWith("Could not recognize a se: ")
}
companion object {
@JvmStatic
fun invalidAges(): Stream<Arguments> =
Stream.of(
arguments("negative", -5),
arguments("zero", 0),
arguments("too much", 1000)
)
}
两个可能的选项(可能还有更多):
首先是将参数注释为未使用,像这样:
@Suppress("UNUSED_PARAMETER")
在函数或参数级别。
第二种选择是在测试中使用 lambda 来执行实际代码,然后使用下划线忽略第一个参数,如下所示:
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.Arguments
import org.junit.jupiter.params.provider.Arguments.arguments
import org.junit.jupiter.params.provider.MethodSource
import java.util.stream.Stream
class Stack {
@ParameterizedTest(name = "Size {index}: {0}")
@MethodSource("invalidAges")
fun shouldFailToCreateAge(hint: String, sizeCandidate: Int) {
process(hint, sizeCandidate) { _, size ->
println("add your test using size here $size")
}
}
private fun process(hint: String, sizeCandidate: Int, block: (String, Int) -> Unit) {
block(hint, sizeCandidate)
}
companion object {
@JvmStatic
fun invalidAges(): Stream<Arguments> =
Stream.of(
arguments("negative", -5),
arguments("zero", 0),
arguments("too much", 1000)
)
}
}
我最终使用了这个仅在 src/test
上下文中引入的函数:
// this function used only to avoid "Parameter is never used" warning
// on intentionally unused parameters
fun Any?.touch() = Unit
这是它在测试方法中的样子:
@ParameterizedTest(name = "Size {index}: {0}")
@MethodSource("invalidAges")
fun shouldFailToCreateAge(hint: String, sizeCandidate: Int) {
hint.touch()
assertThatThrownBy { Size(sizeCandidate) }
.isInstanceOf(InvalidInput::class.java)
.hasMessageStartingWith("Could not recognize a se: ")
}
为什么:
@Suppress("UNUSED_PARAMETER")
严格用于极少数情况下的特殊情况。将它放在所有参数化测试中是不合适的,这会使其变得嘈杂。它还可能导致丢失未使用参数的实际情况,从而帮助出现垃圾代码。touch
方法清楚地表明了意图。它看起来像一个最小的邪恶。