0

我在一个 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

现在,一切正常,但是很难正确进行单元测试,因为静态计数变量的使用使得方法在任何一个测试中读取的哪一行取决于测试运行的顺序。另外,它通常让我觉得设计非常复杂.

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

4

2 回答 2

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];
    }
}

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

于 2013-09-12T14:33:45.463 回答
0

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

这是两个独立的动作。把它分成两种方法,然后你会发现它更容易测试。

于 2013-09-12T14:35:00.377 回答