JUnit 5 - 将多个 CSV 文件参数转换为单个对象

de.*_*.ru 2 java csv parameters junit5

你好,Java 测试人员。几天前我开始使用 JUnit 5,因为我喜欢创建参数化测试的新方法。

还有的@ParameterizedTest,允许在一个参数的方式测试运行,并@CsvFileSource加载从一个CSV文件中的参数。

问题是我的 CSV 中有太多列,并且不希望在我的单元测试中有一个巨大的方法签名。让我给你举个例子:

@ParameterizedTest
@CsvFileSource(resources = "/test-data.csv")
void myTest(String p1, String p2, String p3, String p4, String p5, String p6) {
    //test using parameters
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有某种转换器可以为我做这样的事情:

@ParameterizedTest
@CsvFileSource(resources = "/test-data.csv")
void myTest(@ConvertWith(TestDataConverter.class) TestData testData) {
    //test using parameters
}

static class TestDataConverter implements TestConverter{
    public TestData convert(Object ... params){
       //a simple method that creates the TestData object and inserts the params in it
    }
}
Run Code Online (Sandbox Code Playgroud)

就是这样。

Sam*_*nen 5

更新答案

由于木星的JUnit 5.2:是的,有专门ArgumentsAggregatorArgumentsAccessor用于此目的的API完全相同。

请查看PersonAggregatorJUnit 用户指南中的示例以获取具体示例。

原答案

从 JUnit Jupiter 5.0 开始:不,目前没有开箱即用的转换器可以为您做到这一点。

原因:JUnit Jupiter 中的参数化测试支持不支持从多个参数映射到单个参数。因此,正如@Sormuras 所建议的那样,您可以打开一个问题来推荐它。

在执行实际转换方面,您可以考虑使用uniVocity-parsers,JUnit Jupiter 在内部使用它来解析 CSV 文件。uniVocity-parsers 还支持直接从 CSV 文件映射到beans,但要使用它,您需要实现自己的@TestTemplate读取 CSV 文件并执行映射。

其他选项包括来自Jackson 框架或来自JSefa 项目的 CSV 支持。