使用ClassLoader InputStream时二进制测试资源内容错误

Wrong content of binary test resources when using ClassLoader InputStream

我在测试资源中有一个二进制文件src/test/resources/file.bin:

$ ls -la src/test/resources

-rw-r--r-- 1 g4s8 g4s8 5125 Apr 30 19:53 file.bin

我正在使用它进行测试以验证一些 class。 在测试之前,我需要将内容复制到文件系统,我正在使用 Thread.currentThread().getContextClassLoader() 读取数据:

@Test
public void readsContent(@TempDir final Path tmp) throws Exception {
    final ClassLoader clo = Thread.currentThread().getContextClassLoader();
    final Path file = Files.createFile(tmp.resolve("file.bin"));
    try (
        final InputStream res = new BufferedInputStream(clo.getResourceAsStream("file.bin"));
        final OutputStream out = new BufferedOutputStream(Files.newOutputStream(file, StandardOpenOption.CREATE, StandardOpenOption.WRITE))
    ) {
        byte[] buf = new byte[8192];
        for (int read = res.read(buf); read >= 0; read = res.read(buf)) {
            out.write(buf, 0, read);
        }
    }
    // test code
}

但是这个文件的内容比预期的要大并且与资源文件中的内容不同:

$ ls -la /tmp/junit18423574017636618834/

-rw-r--r-- 1 g4s8 g4s8 9350 May  1 12:22 file.bin

结果文件的大小为 9350 字节,但源文件为 5125。 使用十六进制编辑器,我发现这些文件只有前两个字节是相同的,所有其他数据都不同:

我的代码有什么问题?为什么无法通过 ClassLoader 使用标准方式正确读取此文件?

这是由父 pom.xml 继承的启用 filtering Maven option 引起的,似乎 Maven 设法找到并替换了二进制文件中的一些模式,并且 IDE 使用Maven准备测试资源:

  <build>
    <resources>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${basedir}/src/test/resources</directory>
        <filtering>true</filtering>
      </testResource>
    </testResources>
  </build>

我已经在项目的 pom.xml 中覆盖了这个选项,现在可以使用了:

<build>
  <testResources>
    <testResource>
      <directory>${basedir}/src/test/resources</directory>
      <filtering>false</filtering>
    </testResource>
  </testResources>
</build>