Java:如何对在方法范围内创建和操作文件的方法进行单元测试?

Ree*_*ong 2 java junit unit-testing jmockit

我正在使用 JUnit 和 JMockit 创建一个单元测试方法,用于测试 CSV 文件的创建和操作。如何拦截正在创建的文件以确保正确创建?

@Test
public void testPersistResultsAsCSV() throws IOException {
    final Long id = new Long(1234l);

    TableRow row = new TableRow();
    row.setValue(317l);
    row.setId(1234l);

    final List<TableRow> rows = new ArrayList<TableRow>();
    rows.add(row);

    final List<TableRow> empty = new ArrayList<TableRow>();

    new Expectations() {
        {
            tableService.findTableRowsById(id, (TableQueryOptions)any);
            result = rows;

            tableService.findTableRowsById(id, (TableQueryOptions)any);
            result = empty;

            fileDataService.saveResultsFile((ResultsFile) any);

        }
    };

    resultsToCsvService.persistResultsAsCSV(id);

}
Run Code Online (Sandbox Code Playgroud)

Rog*_*rio 5

我是 JMockit 的创建者,但我会很高兴地说“不要使用 JMockit”。

可以模拟 Java IO 类,但这几乎不是一个好主意;相反,使用本地文件系统上的真实文件。您的测试将更简单,更不脆弱且足够快(除非您做了一些不好的事情,例如读/写大文件,大量文件,或访问缓慢的远程目录 - 但这些都不会在编写良好的测试中发生)。

当人们模拟 IO API(即,,,FileFileWriter)时,他们不可避免地会得到一个与被测代码的实现紧密耦合的测试,因此复杂且脆弱。在实践中,最好让测试接触文件系统;如果这使它成为“集成测试”,那就这样吧。