2016-09-20 98 views
0

我想写一个FitNesse的测试,一个InputStream下载与参考XLSX文件进行比较。从下载比较的InputStream从文件中的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打开,没有问题,比writeDownloadedFile()生成的16.0kB文件大0.3kB,这触发了Excel的修复机制(但可以打开)。

当再次保存打开的文件,Excel创建一个文件,大小22.6kB - 我还需要尝试引用文件比较针对这一个。

我错过了什么?

更新: 打开和保存生成的“downloadedAltFile”与Excel实际上将导致与定期的内部ZipArchive结构类似文件,但我需要知道为什么还是在这个信息丢失 - 如何避免这种情况的课程。有任何想法吗?

+1

保存下载的电子表格到一个文件,然后在其上运行Apache提卡应用在'--detect'模式看看它究竟是什么? – Gagravarr

+0

再次感谢您回复,Gagravar。 Tika显示“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”,与参考文件类型相同。 – fozzybear

回答

1

至于我能在你的榜样您的交易webFixtureIS用它做任何事情之前告诉。我预计行webFixtureIS.close();低于分配给compareEquals。 你是否打算像预期的文件一样将其复制到一个缓冲区,或者是否应该传递它(仍然打开时),还是打算将它存储在本地文件系统中并将它传递给比较函数,... ?

我总是建议您下载文件,将其存储在本地,然后进行比较。这也使您查看手动下载后比较表示,不符合实际的内容的能力......

+0

那么,我正在关闭IS之前将InputData写入BufferedOutputStream。顺便说一句,我已经删除了OS.close()代码,因为它声称是多余的。 – fozzybear

+0

您的代码在关闭后使用'webFixtureIS'。你的代码示例读取就像你将'expectedReferenceFileIS'复制到缓冲区,但没有别的。如果您正在将'webFixtureIS'复制到某个缓冲区,您是否应该将该缓冲区传递给'OPCPackage.open()',以填充'downloaded'? –

+0

好吧,似乎我可以发表评论 - 我已经更新了上面的测试代码,并且使用封闭的InputStream不再适用。如上所述,连续两次开放应该不会成为问题,我想。如上所述,通过基于writeDownloadFileAlt()的方法来存储下载内容不会导致文件POI首先打开,这是由于缺少内部ZIP结构。这只有在Excel中手动打开并保存文件后才起作用,这显然会纠正缺少的归档结构,但它不会帮助我处理测试代码。 – fozzybear