此问题已在此处有答案:
how to do a Unit Test with Junit and mockito in java on methods that read a path and file(1个答案)
8小时前关闭
我想在Java中使用JUnit和Mockito测试一个方法,这个方法基本上是读取一个路径并创建一个文件,如果文件存在,请删除它并重新创建它,有什么例子可以帮助我吗?
下面是我想测试的方法:
public String getFilePE(String fecha) {
String fileName = null;
String filePath = null;
File file = null;
try {
logger.info("Generando archivo para PE");
fileName = ConstantsFiles.FILE_NAME_PE + fecha + ConstantsFiles.FILE_EXTENSION;
filePath = ConstantsFiles.FILE_PATH_PE + fileName;
logger.info(filePath);
file = new File(filePath);
if (file.createNewFile()) {
logger.info("Archivo creado con exito " + file.getName());
} else {
Files.deleteIfExists(Paths.get(filePath));
}
} catch (IOException ex) {
logger.error("Error, el archivo no se pudo generar: " + ex.getMessage(), ex);
}
return filePath;
}
2条答案
按热度按时间sxissh061#
检查
file.createNewFile()
是否调用如果你需要测试所有的情况。类似于
else
语句或catch
块。您需要模拟抛出错误并模拟if
语句hlswsv352#
这里的问题是您在测试中使用了文件系统。这将添加单元测试中不应具有的外部依赖项。文件系统可能处于正确的状态,也可能不处于正确的状态,它们有缓存,可能会随机地使您的测试跳闸,并且它们通常比只使用内存慢得多。最好的办法是重构代码(或者实际上是测试代码的调用者),使其与
InputStream
和OutputStream
一起工作,在真实的生活中,您可以轻松地与FileInputStream
和FileOutputStream
一起使用,但分别与ByteArrayInputStream
和ByteArrayOutputStream
交换。如果您的代码创建了一个空文件,则无法保证当代码的调用方尝试使用该文件时,该文件仍然存在或仍然为空。将文件创建与实际使用文件分离开来会导致symlink race。也就是说,如果您想测试被测代码创建或删除文件,您必须询问文件系统,或者模拟文件系统。
使用真实的的文件系统(我会避免这样做)
使用与测试代码相同的
File
方法,如下所示。请注意,这是未经测试的代码,因为您没有提供MCVE:一些评论:
Thread.sleep
允许文件系统反映更改。目前它的睡眠时间为5秒,这已经够糟糕的了,因为大多数测试的运行速度应该比这快得多。如果测试是不稳定的(有时通过,有时失败),您可能需要增加这个值。模拟文件系统
再次,未经测试的代码:
无论你采用何种风格,都可以沿着这些路线编写更多的测试,e。例如,创建文件并向其中写入一些内容(或假装它存在),然后检查它是否被截断,或者其他任何您想要测试的内容。