每次在Java中调用方法时,都要从CSV文件中读取新行

时间:2013-09-12 14:25:45

标签: java unit-testing file-io static

我在CSV文件中有大量数据,可以通过Java读取(使用OpenCSV)。 我想要的是每次方法访问文件以便它读取下一行。

想象一下file.csv看起来像是:

1,1,1,1,
2,2,2,2,

我的班级看起来像:

public class Stuff
    private static int count = 0;

    public int getFromFile(){
        CSVReader reader = new CSVReader(new FileReader("file.csv"));
        List<String[]> rows = reader.readAll();
        reader.close();
        System.out.println(rows.get(count)[0]);
        count++;
    }
}

如果运行两次,则输出为:

1
2

现在,一切正常,但是很难正确进行单元测试,因为静态计数变量的使用使得方法在任何一个测试中读取的行取决于运行测试的顺序。另外,它通常会让我感到震惊漂亮的绳索设计。

那么,有一种更好的方法可以在后续的方法调用中以一种良好的,可测试的方式读取文件的后续行吗?我知道人们通常很反对使用静态字段,这是可以避免的,所以这里可以避免吗?

2 个答案:

答案 0 :(得分:1)

@thegrinner在他的评论中是正确的 - 但要详细说明......

public class Stuff {
    private static int count = -1;
    private static List<String[] rows>;

    public int getNextLine(){
        if (rows == null) {
            CSVReader reader = new CSVReader(new FileReader("file.csv"));
            List<String[]> rows = reader.readAll();
            reader.close();
        }
        count++;
        return rows.get(count)[0];
    }
}

这未经过测试......但你明白了。

答案 1 :(得分:0)

您对代码进行单元测试的原因是因为它非常糟糕。自动化单元测试往往会导致高度内聚和松散耦合的代码。在你的简短方法中,你实际上是在做两件事情来读取文件并管理你在内存中处理行的方式。

这是两个单独的行动。将其分为两种方法,然后您会发现它更容易测试。