我想使用三个参数来参数化JUnit5测试:x一个一个一个一个一个一个一个一个一个一个一个和x一个一个一个一个二个一个。
到目前为止,使用@CsvSource
时没有任何运气,这是我的用例中传递参数的最方便的方式:
没有将类型为java.lang.String的对象转换为类型为java.util.List的隐式转换
实际测试为:
@ParameterizedTest()
@CsvSource(
"2,1"
)
fun shouldGetDataBit(first: Int, second: String, third: List<String>) {
...
}
你知道这是否可行吗?我在这里使用了Kotlin,但它应该是无关紧要的。
3条答案
按热度按时间rdrgkggo1#
没有理由像StefanE建议的那样使用“黑客”。
在这一点上,我非常肯定Junit5测试参数不支持任何东西,除了原始类型和CsvSource只有一个允许混合类型。
实际上,JUnit Jupiter支持任何类型的参数,只是
@CsvSource
仅限于几个原语类型和String
。因此,您不应使用
@CsvSource
,而应使用@MethodSource
,如下所示。x8diyxa72#
提供第三个元素作为逗号分隔的字符串,并在测试中将该字符串拆分为List。
在这一点上,我非常肯定Junit5测试参数不支持任何东西,除了原始类型和CsvSource只有一个允许混合类型。
3vpjnl9f3#
如果您真的希望将分隔列表作为CSV的一部分传入(例如,它可能真的使代码看起来干净很多),则可以使用JUnit的显式转换功能,使用定制的
ArgumentConverter
。完全通用的列表转换
如果您计划在多个位置使用列表转换,并且每个位置的元素类型不同(例如
List<String>
、List<Integer>
、List<LocalDate>
),则可以创建一个通用的参数转换器,委托不同的参数转换器来转换不同的元素类型。下面的示例使用Google Guava
TypeToken
类来确定列表元素类型,并使用内置的内部JUnitDefaultArgumentConverter
来执行元素转换: