使用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>
我在测试资源中有一个二进制文件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>