2

我正在使用 Groovy Spock 框架、IntelliJ 和 Bazel 构建系统编写测试。目标是从LamborghiniAventador.obj位于与测试文件相同的目录中读取测试数据,Model3dImporterSpec.groovy.

我得到一个java.io.FileNotFoundException.

def "reading from test file in same directory"() {
  given: "some stuff"
     //do some stuff here

  when: "reading from test file"
    def file = Paths.get("LamborghiniAventador.obj").normalize().toFile()   
    def byteArray = getFileAsByteStream(file.getAbsolutePath())

  then: "file should be read and byte array should not be null"
    byteArray != null;        
}

private static byte[] getFileAsByteStream(String pathToFile) {
  return new File(pathToFile).text.getBytes()
}

我在命令行上搜索时文件的路径是:~/Dev/Master/src/test/java/com/censored/api/editor/model3dparsers/LamborghiniAventador.obj

我可以成功地从桌面上的文件中读取,但是一旦我在项目空间中重新定位该文件,事情就会停止工作。

目录树

如何从测试文件中读取测试数据,其中测试数据文件和测试文件位于同一目录中。这是 Java (Eclipse) 中的一项简单任务。我查看了大量其他 Stackoverflow 问题都无济于事,所以我认为我在这里严重缺乏理解。除了答案之外,我还想解释一下。

为澄清而编辑

4

2 回答 2

2

假设规范Model3dImporterSpec.groovy位于:

src/test/groovy/org/whatever

LamborghiniAventador.obj文件应位于:

src/test/resources/org/whatever

为什么?资源文件应保存在与源文件相同的目录下。

然后加载文件使用:

getClass().classLoader.getResourceAsStream('LamborghiniAventador.obj')
于 2015-12-01T21:02:49.683 回答
2

在@Opal 的帮助下,我已经解决了我自己的问题。

1)当您想访问 bazel 中的资源时,您需要通过添加资源数组来更新构建文件:

resources = ["LamborghiniAventador.obj"],

2)def foo = getClass().getResourceAsStream('LamborghiniAventador.obj')正如@Opal 所建议的那样,一旦我做出改变1)就为我工作。所以上面的代码现在是:

 def "reading a file in goovy."() {
   when: "reading file from same directory"
     System.out.println("Going to read from a file in same directory")
     def foo = getClass().getResourceAsStream('LamborghiniAventador.obj')
     def byteArray = foo.getBytes()
   then: "file should be read and byte array should not be null"
     byteArray != null; 
 }
于 2015-12-01T23:18:37.857 回答