如何在Scala-Cli项目中正确配置测试资源以成功读取?
解决Scala CLI+MUnit测试读取资源失败的问题
可行的修正方案:
1. 调整资源读取代码
改用类加载器直接读取资源,避免类加载路径的潜在问题:
val inp: InputStream = classOf[ResourceTests].getClassLoader.getResourceAsStream("testResource.txt")
或者使用系统类加载器读取(同样从类路径根目录查找):
val inp: InputStream = ClassLoader.getSystemResourceAsStream("testResource.txt")
注:ClassLoader的getResourceAsStream不需要路径前的斜杠,它默认从类路径根开始查找。
2. 确认Scala CLI指令配置
确保test.resourceDir指令放在测试文件最顶部,和依赖声明同级:
//> using test.dep org.scalameta::munit::1.0.0 //> using test.resourceDir src/test/resources package org.myorg.myproject.mypack.tests import java.io.InputStream class ResourceTests extends munit.FunSuite: test("getResource"): val inp: InputStream = ClassLoader.getSystemResourceAsStream("testResource.txt") assertNotEquals(inp, null)
3. 验证资源文件的有效性
- 确认资源文件确实存在于
src/test/resources/testResource.txt,文件名无拼写错误(注意Linux/macOS环境下大小写敏感) - 检查是否有
.gitignore或其他构建规则意外排除了该资源文件
4. 临时替代方案:直接读取文件系统路径
如果类路径加载始终有问题,可通过文件系统直接读取(不推荐用于生产测试,但可快速验证资源存在性):
import java.nio.file.Paths import java.nio.file.Files test("getResourceViaFilesystem"): val path = Paths.get("src/test/resources/testResource.txt") val inp = Files.newInputStream(path) assertNotEquals(inp, null)
问题根源说明
Scala CLI处理测试资源时,getClass.getResourceAsStream("/testResource.txt")依赖当前类的类加载器上下文,若资源未被正确映射到测试类路径的根目录,就会返回null。改用类加载器直接读取,能绕过类上下文的路径差异,更可靠地定位类路径根下的资源。
内容的提问来源于stack exchange,提问作者halloleo
相关产品推荐
相关产品推荐

