如何在所有测试 类 中抑制 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: ")
}

为什么:

  1. @Suppress("UNUSED_PARAMETER") 严格用于极少数情况下的特殊情况。将它放在所有参数化测试中是不合适的,这会使其变得嘈杂。它还可能导致丢失未使用参数的实际情况,从而帮助出现垃圾代码。

  2. touch方法清楚地表明了意图。它看起来像一个最小的邪恶。