网络文件列表最新修改日期获取方案及单元测试疑问
问题解答
1. toPath 对网络获取的文件是否有效?
这个问题的核心不在于toPath方法本身,而在于你的自定义file对象转换得到的Path,是否能被JDK的java.nio.file.Files API识别并访问:
- 如果网络文件是通过本地挂载的网络存储(比如把S3、NFS、FTP目录挂载成本地磁盘路径),那么
toPath返回的是标准本地文件系统的Path,Files.getLastModifiedTime可以正常调用,能拿到修改时间。 - 如果网络文件是直接通过HTTP、S3 API等远程协议获取的(未挂载成本地路径),标准
FilesAPI不支持这类远程路径,调用Files.getLastModifiedTime会直接抛出IOException——JDK默认的文件系统提供者只处理本地文件。
这种场景下,你应该改用对应网络存储的SDK来获取文件修改时间(比如AWS S3 SDK的getObjectMetadata方法获取lastModified),而非依赖JDK本地文件API。
2. 能否在单元测试中Mock?
完全可以,常见Mock方式有两种:
方式一:Mock fileService.fetchFiles 返回测试用自定义对象
直接Mock文件服务的返回结果,让它携带预设的自定义文件对象,这些对象的toPath方法返回本地临时文件的Path,这样Files.getLastModifiedTime就能返回你预设的时间戳,方便验证排序逻辑:
// ScalaTest + Mockito示例 val mockFileService = mock[FileService] val testFile1 = CustomFile(/* 构造参数,toPath返回修改时间为1000L的临时文件路径 */) val testFile2 = CustomFile(/* 构造参数,toPath返回修改时间为2000L的临时文件路径 */) when(mockFileService.fetchFiles(...)).thenReturn(List(testFile1, testFile2)) // 验证逻辑 val latest = fileService.fetchFiles(...).map(...).sorted(...).head assert(latest == 2000L)
方式二:封装时间获取逻辑,Mock依赖
把获取文件修改时间的逻辑抽成单独的依赖组件:
trait FileTimeFetcher { def getLastModifiedMillis(file: CustomFile): Long } class DefaultFileTimeFetcher extends FileTimeFetcher { override def getLastModifiedMillis(file: CustomFile): Long = Files.getLastModifiedTime(file.toPath).toMillis }
业务代码依赖这个trait,单元测试时直接Mock它:
val mockFetcher = mock[FileTimeFetcher] when(mockFetcher.getLastModifiedMillis(testFile1)).thenReturn(1000L) when(mockFetcher.getLastModifiedMillis(testFile2)).thenReturn(2000L) // 业务代码调用mockFetcher val latest = fileService.fetchFiles(...) .map(mockFetcher.getLastModifiedMillis) .sorted(Ordering.Long.reverse) .head assert(latest == 2000L)
这种方式完全隔离了对文件系统的依赖,测试更高效稳定。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

