Java8流IO测试

Java8流IO测试,java,unit-testing,testing,java-8,java-stream,Java,Unit Testing,Testing,Java 8,Java Stream,我编写了一个简单的类,它通过使用单个流来读取和写入文件 现在我想通过使用JUnit test或类似的东西来测试它,但我不知道从哪里开始,因为正如你所看到的,这只是一个流,文本会立即打印到一个新文件中 public class OneStreamIOFile { public void fileReaderWriter(String fileReadPath, String filePrintName) { try (Stream<String> streamReader

我编写了一个简单的类,它通过使用单个流来读取和写入文件

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

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();
    }
  }
}

有没有办法解决这个问题?

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

在这里,您必须将重点放在测试方法的输入和输出上

在输入中,您有
String fileReadPath
表示您从中读取的文件;在输出中,您有
String filePrintName
,即由测试方法创建的文件

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

在测试中,将其
字符串
表示形式传递给被测试的方法。

然后,断言该方法创建的文件与预期的输出文件具有相同的内容

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

在这里,您必须将重点放在测试方法的输入和输出上

在输入中,您有
String fileReadPath
表示您从中读取的文件;在输出中,您有
String filePrintName
,即由测试方法创建的文件

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

在测试中,将其
字符串
表示形式传递给被测试的方法。

然后,断言该方法创建的文件与预期的输出文件具有相同的内容

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

公共类样本{

@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());


}
@规则
public TemporaryFolder TemporaryFolder=新建TemporaryFolder();
@试验
public void testFileReaderWriter()引发IOException、InterruptedException{
File File=temporaryFolder.newFile(“sample.txt”);
Date createdTime=新日期();
OneStreamIOFile选项=新建OneStreamIOFile();
睡眠(1000);
options.fileReaderWriter(file.getAbsolutePath(),“hellow”);
日期修改时间=新日期();

Assert.assertTrue(createdTime.getTime()您可以使用下面的代码段检查文件是否已写入

公共类样本{

@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());


}
@规则
public TemporaryFolder TemporaryFolder=新建TemporaryFolder();
@试验
public void testFileReaderWriter()引发IOException、InterruptedException{
File File=temporaryFolder.newFile(“sample.txt”);
Date createdTime=新日期();
OneStreamIOFile选项=新建OneStreamIOFile();
睡眠(1000);
options.fileReaderWriter(file.getAbsolutePath(),“hellow”);
日期修改时间=新日期();

Assert.assertTrue(createdTime.getTime()考虑单一责任原则的干净代码原则——一旦你应用了这一点,你就可以很容易地知道如何测试——当你命名你的方法读写时,你的ALE铃应该已经响了……使用<代码> PrimWruts这样的任务是邪恶的。由于您无法找出发生的错误,您应该远离生产代码中的
PrintWriter
(除非真正写入控制台)。作为旁注,
Arrays.stream(line.trim().split([\\s]+)).reduce((a,b)->a++“+”+b)。get()
line.trim().replaceAll(“\\s+”,“+”)相比是非常复杂的
…顺便说一句,
.mapToInt(Integer::valueOf)
将每个值装箱成一个
整数
,只是在事后取消装箱。您应该更喜欢
.mapToInt(Integer::parseInt)如果您需要验证写入文件的文本,则必须读取文件并执行一个断言。读写方法…使用
PrintWriter
执行这样的任务是有害的。您应该做的最低限度是在事后调用以确定是否发生了错误。由于您无法确定发生了哪一个错误,因此您应该远离生产代码中的
PrintWriter
(除非真正写入控制台)作为旁注,
Arrays.stream(line.trim().split(“[\\s]+”)).reduce((a,b)->a++“++”+b.get()
line.trim().replaceAll(“\\s+”,“+”)
…以及顺便说一句,
.mapToInt(Integer::valueOf)相比,它是非常复杂的
将每个值装箱成一个
整数
,只是为了在事后取消装箱。您应该更喜欢
.mapToInt(Integer::parseInt)
…如果需要验证写入文件的文本,您必须读取文件并执行相等的断言。我添加示例以验证文件写入是否成功。