Неверное содержимое бинарных тестовых ресурсов при использовании ClassLoader InputStream - PullRequest
0 голосов
/ 01 мая 2020

У меня есть бинарный файл в тестовых ресурсах src/test/resources/file.bin:

$ ls -la src/test/resources

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

Я использую его для тестов для проверки некоторого класса. Перед тестированием мне нужно скопировать содержимое в файловую систему, я использую 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. С помощью шестнадцатеричного редактора я выяснил, что только первые два байта этих файлов одинаковы, все остальные данные отличаются: enter image description here

Что не так с моим кодом? Почему этот файл не может быть правильно прочитан стандартным способом через ClassLoader?

1 Ответ

0 голосов
/ 01 мая 2020

Это вызвано включенной filtering опцией Maven , унаследованной от родительского pom.xml, похоже, 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>
...