【问题标题】:How to write a junit test for a scanner? (Reading a file)如何为扫描仪编写 junit 测试? (读取文件)
【发布时间】:2021-09-22 08:04:54
【问题描述】:

我有一个扫描文件并将值分配给对象的方法:

private List<Customer> customerList = new ArrayList<Customer>();

public void scanLocalFile() throws FileNotFoundException {
  File file = new File("input.txt");
  Scanner scan = new Scanner(file);
  while (scan.hasNextLine()) {
      String[] fields = line.split(";");
      String name = fields[0];
      String score = fields[1];

  Customer customer = new Customer(name, score);
  customerList.add(customer);
  }
scan.close();
}

如何为这样的方法编写 junit 测试?单元测试是否也可以使用相同的文件(“input.txt”)?

文件结构:

John Smith;45;
Adam West;78;

【问题讨论】:

  • 不要对文件进行硬编码;确保您可以将其作为参数传递给该方法。然后使用测试输入文件调用该方法,然后检查 customerList 的内容
  • 这里有类似的问题how-to-junit-test-a-method-with-a-scanner
  • 或者,传入一个Reader 作为Scanner 构造函数的参数:那么您甚至不必担心文件,因为您可以使用例如StringReader。但是请注意,如果您传入Reader,则不应在最后关闭Scanner,因为这将关闭Reader;代码关闭未打开的Reader(或WriterInput/OutputStream)是不好的做法。
  • 另外:将customerList 作为您添加的字段有点可疑(如果您调用scanLocalFile() 两次呢?)。在这个方法中构造一个新列表,添加到它,然后返回列表。

标签: java junit


【解决方案1】:

使此代码可单元测试的基本方法是不对input.txt 文件的使用进行硬编码。

Stultuske suggestsFile 作为参数传递给该方法,以便您可以在测试期间为任意文件运行该方法。

我会更进一步说:传入ReaderScanner 有一个接受Reader 的构造函数,这样你就不必在单元测试期间搞乱文件了。

例如,您可以构造一个带有硬编码字符串的StringReader,即“文件内容”。

StringReader sr = new StringReader("John Smith;45;\nAdam West;78;");

但是请注意,如果您传入Reader,则不应在最后关闭Scanner,因为这将关闭Reader;代码关闭未打开的Reader(或WriterInput/OutputStream;通常是任何资源)是不好的做法。

public void scanLocalFile(Reader r) {
  Scanner scan = new Scanner(r);
  while (scan.hasNextLine()) {
     // ...
  }
}

实际上,由于您只是从扫描仪中读取行,我认为使用BufferedReader 会更好:

public void scanLocalFile(Reader r) {
  new BufferedReader(r).lines()
      .map(line -> {
        String[] fields = line.split(";");
        return new Customer(fields[0], fields[1]);
      })
      .forEach(customerList::add);
}

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多