Java 8 Streams IO - 测试

时间:2018-02-06 11:14:48

标签: java unit-testing testing java-8 java-stream

我写过一个简单的类,它使用单个流来读写文件。

现在我想通过使用JUnit测试或类似的东西来测试它,但我不知道从哪里开始,因为你可以看到这只是一个流,文本立即打印到一个新文件。

public class OneStreamIOFile {

  public void fileReaderWriter(String fileReadPath, String filePrintName) {
    try (Stream<String> streamReader = Files.lines(Paths.get(fileReadPath));
        PrintWriter printWriter = new PrintWriter(filePrintName)) {

      streamReader
          .filter(line -> line.matches("[\\d\\s]+"))
          .map(line -> Arrays.stream(line.trim().split("[\\s]+"))
              .reduce((a, b) -> a + "+" + b).get() + "="
              + Arrays.stream(line.trim().split("[\\s]+"))
              .mapToInt(Integer::valueOf).sum())
          .forEachOrdered(printWriter::println);

    } catch (IOException e) {
      System.out.println("File not found");
      e.printStackTrace();
    }
  }
}

主要课程

  public class Main {
        public static void main(String[] args) {
            String filePath = "src/test/java/resources/1000.txt";
            String filePrintName = "resultStream.txt";

            new OneStreamIOFile().fileReaderWriter(filePath, filePrintName);
        }
    }

知道怎么处理这个吗?

2 个答案:

答案 0 :(得分:2)

单元测试必须关注行为,而不是实现细节 您使用从流中读取并写入另一个流的方式无关紧要。

在这里,您必须关注所测试方法的输入输出

在输入中,您有String fileReadPath表示您从中读取的文件,并且在输出中您有String filePrintName,该文件由被测方法创建。

因此,对于单元测试OneStreamIOFile.fileReaderWriter(),创建一个输入测试文件并创建一个预期的输出测试文件,其中包含您将输入测试文件传递给方法时所期望的内容。
当然将它们存储在您的测试文件夹中。

在测试中,将他们的String表示传递给测试中的方法。 然后,断言该方法创建的文件与预期的输出文件具有相同的内容。

答案 1 :(得分:0)

您可以使用以下代码段检查文件是否已写入。

公共类示例{

@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();

@Test
public void testFileReaderWriter() throws IOException, InterruptedException {

    File file=temporaryFolder.newFile("sample.txt");
    Date createdTime=new Date();
    OneStreamIOFile options=new OneStreamIOFile();
    Thread.sleep(1000);
    options.fileReaderWriter(file.getAbsolutePath(),"hellow");
    Date modifiedTime=new Date();
    Assert.assertTrue(createdTime.getTime()<modifiedTime.getTime());


}

}

创建文件后需要花些时间,如果需要检查内容,可以阅读文件内容并断言。

TemporyFolder是一个用于处理Junit中文件操作的规则。