2015-06-14 33 views
2

对于测试,我使用的是内存中的NIO FileSystem实现(memoryfs)。我之前利用过它,它似乎在例如Maven的。自定义NIO文件系统无法通过SBT的测试任务进行加载

但是,现在,在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 borks类路径莫名其妙,但很难说为什么。有趣的是,IntelliJ IDEA的测试运行器似乎没有问题,问题只出现在命令行上(在“SBT本身”中)。

+0

Java使用文件“META-INF /服务/ java.nio.file.spi。 FileSystemProvider“来定位FileSystemProviders。如果你有多个定制的FileSystem,你可能会遇到合并问题。要检查它是否是memoryfs的问题,请尝试使用其他体面的内存文件系统之一,例如JimFS。 P.S.作为memoryfs的作者,我很高兴听到用户对结果非常感兴趣。 – openCage

+0

@openCage:哇,谢谢你对这个问题的兴趣!您的评论显然有帮助,请参阅下面的答案。 –

回答

1

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

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

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

最简单的方法可能只是叉测试VM,即添加以下到您的build.sbt

fork in Test := true 
相关问题