2016-09-20 10 views
0

Я пытаюсь написать тест 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, но мне нужно знать, почему и где эта информация теряется - и как этого избежать курс. Есть идеи?

+1

Сохраните загруженную таблицу в файл, затем запустите приложение Apache Tika в режиме '--detect' посмотреть, что это на самом деле? – Gagravarr

+0

Еще раз спасибо за ответ, Гагравар. Тика раскрывает «application/vnd.openxmlformats-officedocument.spreadsheetml.sheet», тот же тип, что и ссылочный файл. – fozzybear

ответ

1

Насколько я могу судить в вашем примере, вы закрываете webFixtureIS, прежде чем что-либо делать с ним. Я ожидаю, что строка webFixtureIS.close(); будет ниже заданного значения compareEquals. Вы собираетесь скопировать это в буфер, как ожидаемый файл, или он должен быть просто передан (пока все еще открыт), или вы намеревались сохранить его в локальной файловой системе и передать его функции сравнения ... ?

Я бы порекомендовал вам скачать файл, сохранить его локально, а затем сравнить его. Это также дает вам возможность просматривать фактическое содержимое, загруженное вручную после того, как сравнение говорит, что оно не соответствует ...

+0

Ну, я пишу InputData в BufferedOutputStream перед закрытием IS. Кстати, я удалил код OS.close(), как было заявлено, что он лишний. – fozzybear

+0

Ваш код использует 'webFixtureIS' после того, как вы его закрыли. И ваш пример кода читается как копирование 'expectedReferenceFileIS' в буфер, но ничего больше. ЕСЛИ вы копируете 'webFixtureIS' в какой-то буфер, вы не должны передавать этот буфер в' OPCPackage.open() ', чтобы заполнить' загружен'? –

+0

Хорошо, я могу поместить комментарий - я уже обновил свой тестовый код выше, и использование закрытого InputStream больше не должно применяться. Думаю, открытие одного раза подряд, как указано выше, не должно представлять проблемы. Для хранения загружаемого контента с помощью метода writeDownloadFileAlt() не будет происходить, чтобы файл POI мог открываться в первую очередь из-за отсутствия внутренней структуры ZIP, как упоминалось выше. Это работает только после ручного открытия и сохранения файла снова в Excel, что явно устраняет недостающую структуру архива, но это не поможет мне с тестовым кодом. – fozzybear