Java8流IO测试
我编写了一个简单的类,它通过使用单个流来读取和写入文件 现在我想通过使用JUnit test或类似的东西来测试它,但我不知道从哪里开始,因为正如你所看到的,这只是一个流,文本会立即打印到一个新文件中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
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)
…如果需要验证写入文件的文本,您必须读取文件并执行相等的断言。我添加示例以验证文件写入是否成功。