Как подавить предупреждение Kotlin о неиспользуемом параметре во всех тестовых классах?
В параметризованных тестах я использую
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)
)
}
2 ответа
Два возможных варианта (может быть и больше):
Первый — пометить параметр как неиспользуемый, например:
@Suppress("UNUSED_PARAMETER")
либо на уровне функции, либо на уровне параметра.
Второй вариант — использовать лямбду внутри вашего теста для выполнения фактического кода, а затем использовать подчеркивание, чтобы игнорировать первый параметр, например:
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
метод ясно показывает намерение. И это выглядит как минимальное зло.