我很好奇,如果在Kotlin中,在Junit5中的参数化测试中,我可以将类外的方法用作@MethodSource。
我知道在Kotlin中使用@MethodSource的2种方法-伴随对象和@TestInstance(TestInstance.Lifecycle.PER_CLASS)。我想知道是否可以通过其他方式完成操作,例如,通过在类外部声明方法并使用一些注释?我尝试过这种方式,但是它不起作用,我想知道是否可以做类似的事情。
class GenerationStatusTest {
@ParameterizedTest
@MethodSource("provideStatusesToTest")
internal fun shouldStatusesHaveExpectedAbilities(generationStatus: GenerationStatus, assertions:(GenerationStatus)->Unit) {
assertions(generationStatus)
}
}
fun provideStatusesToTest(): Stream<Arguments> {
return Stream.of(
Arguments.of(WAITING, canDoNothing),
Arguments.of(PROCESSING, canDoNothing)
)
}
org.junit.platform.commons.JUnitException: Could not find factory method [provideStatusesToTest] in class [com.test.enums.GenerationStatusTest]
at org.junit.jupiter.params.provider.MethodArgumentsProvider.lambda$getMethod$4(MethodArgumentsProvider.java:83)
答案 0 :(得分:2)
可以通过提供其完全限定的方法名称来引用外部静态工厂方法,如以下示例所示。
在org.example包内的app.kt文件中声明的所有函数和属性(包括扩展函数)都被编译为名为org.example.AppKt的Java类的静态方法。
因此,如果程序包名称为com.test.enums
(根据错误消息),而您的文件名为GenerationStatusTest.kt
,则包含provideStatusesToTest
的生成类为com.test.GenerationStatusTestKt
,因此您需要的注释是
@MethodSource("com.test.enums.GenerationStatusTestKt#provideStatusesToTest")
答案 1 :(得分:0)
最好的解决方案是在提供程序功能中添加@JvmStatic
注释。
class SumTest {
@ParameterizedTest(name = "{0} + {1} = {2}")
@MethodSource("sumProvider")
fun sum(a: Int, b: Int, expected: Int) {
Truth.assertThat((a + b)).isEqualTo(expected)
}
companion object {
@JvmStatic
fun sumProvider(): Stream<Arguments> {
return Stream.of(
Arguments.of(1, 2, 3),
Arguments.of(5, 10, 15)
)
}
}
}