关于如何测试接收字符串并将它们放入ArrayList的BufferedReader和FileReader的建议

Big*_*992 2 java tdd file-io mocking mockito

我有一个类,它有一个逐行读取文本文件的方法,然后将每一行放入一个ArrayList字符串.这是我的代码:

public class ReadFile {

    public List<String> showListOfCourses() throws IOException {
        String filename = "countriesInEurope.txt";
        FileReader fr = new FileReader(filename);
        BufferedReader br = new BufferedReader(fr);
        List<String> courseList = new ArrayList<>();

        while (true) {
            String line = br.readLine();
            if (line == null) {
                break;
            }

            courseList.add(line);
        }
        br.close();

        return courseList;
    }

}
Run Code Online (Sandbox Code Playgroud)

我希望通过Mockito涉及Arrange/Act/Assert 来测试这种方法的一些建议.我听说涉及文本文件的读者可能很难测试,创建临时文件不是最好的做法,因为它耗尽了内存?任何建议将非常感谢.

Sto*_*ica 8

由于文件名countriesInEurope.txt在您的实现中是硬编码的,因此这是不可测试的.使这个可测试的一个好方法是重构该方法以获取Readeras参数:

public List<String> showListOfCourses(Reader reader) throws IOException {
    BufferedReader br = new BufferedReader(reader);
    List<String> courseList = new ArrayList<>();

    // ...

    return courseList;
}
Run Code Online (Sandbox Code Playgroud)

您的主要实现可以传递FileReader给它.另一方面,在测试时,您的测试方法可以传递一个StringReader实例,该实例很容易使用示例内容作为简单字符串创建,不需要临时文件,例如:

@Test
public void showListOfCourses_should_read_apple_orange_banana() {
    Reader reader = new StringReader("apple\norange\nbanana");
    assertEquals(Arrays.asList("apple", "orange", "banana"), showListOfCourses(reader));
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,该方法的名称并不好,因为它没有"显示"任何东西. readListOfCourses会更有意义.