我正在学习如何用JUnit 5在Kotlin中编写测试。在编写Java时,我喜欢使用@Nested
、@ParametrizedTest
和@MethodSource
等功能。但当我切换到Kotlin时,我遇到了一个问题:
我学会了如何使用
@Nested
通过引用嵌套Kotlin类中的此JUnit测试运行gradle测试时未找到@ParametrizedTest
和@MethodSource
,参见Kotlin Developers的JUnit 5-第4.2节
但当我把这些放在一起时,我得到了
此处不允许使用Companion对象。
内部类内部的
。
测试以再现错误
internal class SolutionTest {
@Nested
inner class NestedTest {
@ParameterizedTest
@MethodSource("testCases")
fun given_input_should_return_expected(input: Int, expected: Int) {
// assert
}
// error in below line
companion object {
@JvmStatic
fun testCases(): List<Arguments> {
return emptyList()
}
}
}
}
有可能解决这个错误吗?那么我可以一起使用@Nested
、@ParametrizedTest
和@MethodSource
吗?
您可以使用外部类的完全限定名称来指定方法@MethodSource("com.example.SolutionTest#testCases")
下面是一个嵌套测试的示例。
package com.example
// imports
internal class SolutionTest {
@Test
fun outerTest() {
// ...
}
@Nested
inner class NestedTest {
@ParameterizedTest
@MethodSource("com.example.SolutionTest#testCases")
fun given_input_should_return_expected(input: Int, expected: Int) {
Assertions.assertEquals(input + 2, expected)
}
}
companion object {
@JvmStatic
fun testCases(): List<Arguments> {
return listOf(
Arguments.of(1, 3),
Arguments.of(2, 4),
)
}
}
}
如果您不介意使用@TestInstance(PER_CLASS)
,那么您可以像普通Kotlin方法一样定义MethodSource方法,而不需要配套对象:
internal class SolutionTest {
@Nested
@TestInstance(PER_CLASS)
inner class NestedTest {
@ParameterizedTest
@MethodSource("testCases")
fun given_input_should_return_expected(input: Int, expected: Int) {
// assert
}
fun testCases(): List<Arguments> {
return emptyList()
}
}
}