自定义NIO文件系统不会通过SBT的测试任务加载

时间:2015-06-14 20:29:53

标签: scala sbt nio2

为了进行测试,我使用了内存中的NIO FileSystem实现(memoryfs)。我之前已经利用了它,它似乎运行良好,例如行家。

但是,现在,在SBT项目中,无法初始化新的FileSystem

这是重现问题的最小SBT配置:

import sbt._
import Keys._

name := "testfs"
organization := "com.example
version := "0.1-SNAPSHOT"

scalaVersion := "2.11.6"

libraryDependencies ++= { 
  val scalaTestVersion = "2.2.5"
  Seq(
    "org.scalatest" %% "scalatest" % scalaTestVersion % "test",
    "org.mockito" %  "mockito-core" % "1.10.19" % "test",
    "de.pfabulist.lindwurm" %  "memoryfs" % "0.28.3"   % "test"
  )}

这是一个测试:

import de.pfabulist.lindwurm.memory.MemoryFSBuilder
import org.scalatest.{FlatSpec, MustMatchers}


class FsDummySpec extends FlatSpec with MustMatchers {

  it must "init the FS" in {
    new MemoryFSBuilder().watchService(true).name("testFs").build() //init here
  }
}

运行sbt test将导致:

[info] FsDummySpec:
[info] - must init the FS *** FAILED ***
[info]   java.nio.file.ProviderNotFoundException: Provider "memoryfs" not found
[info]   at java.nio.file.FileSystems.getFileSystem(FileSystems.java:224)
[info]   at de.pfabulist.kleinod.paths.Pathss.getOrCreate(Pathss.java:76)

这就是事情:这应该没有任何问题。我的问题是:为什么以及如何修复

看了custom FS provider docs它看起来像是SBT以不同的方式点击了类路径,但很难说出原因。

注意:有趣的是,IntelliJ IDEA的测试运行器似乎顺利工作,问题只出现在命令行上(" SBT本身")

1 个答案:

答案 0 :(得分:2)

openCage的评论暗示了解决方案。

事实证明,自定义文件系统确实需要一个额外的元素,即META-INF/services中的服务提供者定义文件。

如果您使用自定义NIO文件系统,则需要在测试类路径中提供该提供程序定义文件。

最简单的方法可能只是分叉测试虚拟机,即将以下内容添加到build.sbt

fork in Test := true