我遇到这种情况,我正在使用junitparams从输入文件中读取值。在某些情况下,我的行在所有列中都有值(例如5),但是在其他情况下,仅前几列具有值。
我希望junitparams为可用变量分配值,然后将null或任何其他默认值分配给其余没有输入值的变量
可以用junit params做到吗?

输入文件

col1,col2,col3,col4,col5
1,2,3,4,5
1,3,4
1,3,4,5
1,2,3


我的代码是

@RunWith(JUnitParamsRunner.class)
public class PersonTest {

    @Test
    @FileParameters(value="src\\junitParams\\test.csv", mapper = CsvWithHeaderMapper.class)
    public void loadParamsFromFileWithIdentityMapper(int col1, int col2, int col3, int col4, int col5) {
        System.out.println("col1 " + col1 + " col2 " + col2 + " col3 " + col3 + " col " + col4 + " col5 " + col5);
        assertTrue(col1 > 0);
    }

}


PS我之前使用feed4junit来完成此操作,但是由于junit 4.12与feed4junit之间存在一些兼容性问题,因此我不得不切换到junitparams。我想用junit param模拟相同的行为

最佳答案

我建议提供自己的映射器,该映射器会将一些默认数值附加到不完整的行中:

@RunWith(JUnitParamsRunner.class)
public class PersonTest {

    @Test
    @FileParameters(value = "src\\junitParams\\test.csv", mapper = MyMapper.class)
    public void loadParamsFromFileWithIdentityMapper(int col1, int col2, int col3, int col4, int col5) {
        System.out.println("col1 " + col1 + " col2 " + col2 + " col3 " + col3 + " col " + col4 + " col5 " + col5);
        assertTrue(col1 > 0);
    }

    public static class MyMapper extends IdentityMapper {

        @Override
        public Object[] map(Reader reader) {
            Object[] map = super.map(reader);
            List<Object> result = new LinkedList<>();
            int numberOfColumns = ((String) map[0]).split(",").length;
            for (Object lineObj : map) {
                String line = (String) lineObj;
                int numberOfValues = line.split(",").length;
                line += StringUtils.repeat(",0", numberOfColumns - numberOfValues);
                result.add(line);
            }
            return result.subList(1, result.size()).toArray();
        }
    }
}

07-26 05:17