Я пытаюсь написать тест FitNesse, который сравнивает загрузку InputStream с эталонным файлом XLSX.Сравнение InputStream от Download to InputStream из файла в FitNesse
Теперь проблема заключается в том, что содержимое, которое я получаю из загрузки InputStream, очевидно, не является допустимым Zip-архивом (каким он должен быть, как ссылочный файл), кроме текущего содержимого файла, отличающегося в целом (но это не так проблема здесь).
Метод тестирования арматура, я ссылаться в тесте FitNesse содержит этот код (обновленный):
File downloadedFile = writeDownloadedFile();
File downloadedAltFile = writeDownloadedFileAlt();
File expectedReferenceFile = new File(expectedReferenceFilePath.toUri());
InputStream webFixtureIS = getDialog().getInputStream();
InputStream expectedReferenceFileIS = Files.newInputStream(expectedReferenceFilePath);
byte[] testDownloadedFileBytes = Files.readAllBytes(downloadedFile.toPath());
byte[] testDownloadedAltFileBytes = Files.readAllBytes(downloadedAltFile.toPath());
// expectedReferenceFileIS = Files.newInputStream(expectedReferenceFilePath);
// compareEquals = ExcelCompare.workbookEqual(new XSSFWorkbook(OPCPackage.open(downloadedAltFile)), new XSSFWorkbook(OPCPackage.open(expectedReferenceFileIS)));
// expectedReferenceFileIS.close();
// Direct compare from webFixtureInputStream
webFixtureIS = getDialog().getInputStream();
expectedReferenceFileIS = Files.newInputStream(expectedReferenceFilePath);
compareEquals = ExcelCompare.workbookEqual(new XSSFWorkbook(OPCPackage.open(webFixtureIS)), new XSSFWorkbook(OPCPackage.open(expectedReferenceFileIS)));
webFixtureIS.close();
expectedReferenceFileIS.close();
ExcelCompare.workbookEqual() основан на XLSX workbook comparing solution я применил для этой цели as a workaround here.
В принципе, при сравнении с webFixtureIS, OPCPackage.getParts() генерирует исключение, потому что никаких PackageParts не воевавшие в содержании загрузки (ZipArchive не содержит записей):
org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]
at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:197)
at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:696)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:280)
При сравнении с downloadedAltFile вместо (прокомментированный код выше), ZipPackage.getPartsImpl() -> ZipEntrySource.getEntries() не будет работать, поскольку внутренний ZipArchive имеет значение NULL.
Даже так, написание скачать InputStream в файл, как это приведет к XLSX книге, которую можно открыть с Excel и OpenOffice (обновлено):
private File writeDownloadedFileAlt() throws IOException, FileNotFoundException {
InputStream webFixtureIS = getDialog().getInputStream();
Path tmpFilePath = Files.createTempFile("jwebunitTestFileAlt", ".xlsx");
byte[] webFixtureIsBytes = IOUtils.toByteArray(webFixtureIS);
// Files.write(tmpFilePath, webFixtureIsBytes, StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE);
Files.write(tmpFilePath, webFixtureIsBytes, StandardOpenOption.CREATE);
webFixtureIS.close();
return new File(tmpFilePath.toUri());
}
private File writeDownloadedFile() throws IOException, FileNotFoundException {
InputStream webFixtureIS = getDialog().getInputStream();
File tmp = File.createTempFile("jwebunitTestFile.xlsx", null);
int c=0;
// InputStream in = getTestingEngine().getInputStream();
tmp.createNewFile();
tmp.deleteOnExit();
OutputStream out = new BufferedOutputStream(new FileOutputStream(tmp));
while ((c = webFixtureIS.read()) != -1) out.write(c);
webFixtureIS.close();
// out.close();
return tmp;
}
writeDownloadedFileAlt() приведет к книге , который может быть открыт Excel без проблем, на 0.3kB больше, чем 16.0kB файл writeDownloadedFile(), который запускает механизм восстановления Excel (но может быть открыт еще).
При сохранении открытого файла Excel создает файл размером 22.6kB - мне все еще нужно попробовать сравнить файл ссылки с этим.
Что мне не хватает?
Обновление: Открытие и сохранение сгенерированного «скаченного файла» с помощью Excel фактически приведет к сопоставимому файлу с регулярной внутренней структурой ZipArchive, но мне нужно знать, почему и где эта информация теряется - и как этого избежать курс. Есть идеи?
Сохраните загруженную таблицу в файл, затем запустите приложение Apache Tika в режиме '--detect' посмотреть, что это на самом деле? – Gagravarr
Еще раз спасибо за ответ, Гагравар. Тика раскрывает «application/vnd.openxmlformats-officedocument.spreadsheetml.sheet», тот же тип, что и ссылочный файл. – fozzybear