我正在使用SBT在Scala项目中工作,因此该项目遵循默认目录结构:
project_name/
├── build.sbt
├── src
│ ├── main
│ │ ├── resources
│ │ │ └── production.txt
│ │ └── scala
│ │ └── ...
│ └── test
│ ├── resources
│ │ └── test.txt
│ └── scala
│ └── ...
当我尝试读取资源文件夹中的文件时,在生产代码中,我试试这个,并且工作得很好:
object FileReader extends App {
io.Source.fromResource("production.txt").getLines.toList.foreach(println(_))
}
但是当我尝试在测试代码中做同样的事情时:
class FileReaderTest extends FreeSpec with Matchers {
"Source" - {
"reads files from resources folder" in {
val lines = io.Source.fromResource("test.txt").getLines.toList
lines should be(List("Hello","World"))
}
}
}
我得到了一个NPE例外:
[info] Source
[info] - reads files from resources folder *** FAILED ***
[info] java.lang.NullPointerException:
[info] at java.io.Reader.<init>(Reader.java:78)
[info] at java.io.InputStreamReader.<init>(InputStreamReader.java:129)
[info] at scala.io.BufferedSource.reader(BufferedSource.scala:22)
[info] at scala.io.BufferedSource.bufferedReader(BufferedSource.scala:23)
[info] at scala.io.BufferedSource.charReader$lzycompute(BufferedSource.scala:33)
[info] at scala.io.BufferedSource.charReader(BufferedSource.scala:31)
[info] at scala.io.BufferedSource.scala$io$BufferedSource$$decachedReader(BufferedSource.scala:60)
[info] at scala.io.BufferedSource$BufferedLineIterator.<init>(BufferedSource.scala:65)
[info] at scala.io.BufferedSource.getLines(BufferedSource.scala:84)
[info] ...
当我尝试在测试中阅读production.txt
文件时,它也可以正常工作。所以我的猜测是,由于某种原因,测试资源文件夹没有被加载到类路径中。所以有了这个,我研究了SBT,似乎默认情况下,src/test/resources
文件夹已经是默认文件夹,事实上,只需检查SBT shell,它就会产生以下结果:
> show test:resourceDirectory
[info] <path to project>/src/test/resources
> show test:unmanagedResources
[info] * <path to project>/src/test/resources
> show test:unmanagedResourceDirectories
[info] * <path to project>/src/test/resources
很明显,我错过了一些东西,但不知道在哪里继续研究。
顺便说一句,我使用的是Scala 2.12.4,SBT 1.0.2和scalatest 3.0.4
更新
似乎问题与SBT构建或IDE有关,正如我所做的那样可以使用build.sbt
文件进行实验,更改和玩unmanagedResources
,resourceDirectory
以及其他一些文件在Test
范围内,最后在某处出现了腐败现象。
我正在使用IntelliJ IDEA,在使用SBT Test
范围删除所有实验后,删除.idea
文件夹并重新导入SBT项目,它运行正常。
另外,对于可能与其他问题重复的问题,我认为存在差异,因为最初它使用位于src/main/resources
的资源,而不是src/test/resources
。< / p>