Как подавить предупреждение 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: ")
}

Почему:

  1. В @Suppress("UNUSED_PARAMETER")предназначена строго для особых ситуаций в редких случаях. И было бы неуместно помещать его во все параметризованные тесты, делая его шумным. Это также может привести к отсутствию реальных случаев неиспользуемых параметров, способствуя появлению мусорного кода.

  2. В touchметод ясно показывает намерение. И это выглядит как минимальное зло.

Другие вопросы по тегам