2016-09-20 22 views
0

私は、InputStreamのダウンロードを参照XLSXファイルと比較するFitNesseテストを作成しようとしています。ダウンロードからのInputStreamとFitNesseのFileからのInputStreamの比較

私の問題は、InputStreamのダウンロードから得られるコンテンツは、明らかに現在のファイルの内容とは別に、一般的なものとは別に、有効なZipアーカイブ(これは参照ファイルと同じ)であることです。ここの問題)。

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()私は、この目的のために適用as a workaround hereXLSX workbook comparing solutionに基づいている:私はFitNesseの試験で参照

試験治具の方法は、(更新)このコードを含んでいます。 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を書くことはExcelとOpenOfficeの(更新)で開くことができXLSXワークブック、になります:

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は()ワークブックになりますこれは問題なくエクセルで開くことができ、16kバイトのファイルwriteDownloadedFile()より0.3kB大きく、Excelの修復メカニズムを起動します(ただし、まだ開くことができます)。

開かれたファイルを再度保存すると、22.6kBのサイズのファイルがExcelによって作成されます。このファイルは、参照ファイルと比較して試してみる必要があります。

私には何が欠けていますか?

更新: 生成された「downloadedAltFile」をExcelで開いて保存すると、実際には通常の内部ZipArchive構造と同等のファイルが作成されますが、この情報が失われた理由や場所を知る必要があります。コース。何か案は?

+1

ダウンロードしたスプレッドシートをファイルに保存し、 '--detect'モードでApache Tikaアプリケーションを実行しますそれが本当に何かを見るために? – Gagravarr

+0

Gagravarに返信してくれてありがとう。 Tikaは、参照ファイルと同じタイプの "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"を公開しています。 – fozzybear

答えて

1

あなたの事例では、何かをする前に、私があなたの閉じるwebFixtureISを伝えることができます。私はwebFixtureIS.close();の行がcompareEqualsに割り当てられていると予想します。 これは、期待されるファイルのようにバッファにコピーしたいのですか、それとも単にオープンしたままにするか、それをローカルファイルシステムに保存してcompare関数に渡そうとしましたか? ?

ファイルをダウンロードし、ローカルに保存して比較することをお勧めします。これはまた、あなたが実際にダウンロードした実際のコンテンツを比較した後に手動でダウンロードすることができます。

+0

さて、ISを閉じる前にBufferedOutputStreamにInputDataを書いています。 Btw。、私はOS.close()コードを削除しました。 – fozzybear

+0

あなたのコードはあなたがそれを閉じた後に 'webFixtureIS'を使っています。そしてあなたのコードサンプルは 'expectedReferenceFileIS'をバッファにコピーするようなものですが、それ以外は何も読み込まれません。 'webFixtureIS'をいくつかのバッファにコピーしている場合、そのバッファを' OPCPackage.open() 'に渡すべきではありません。 –

+0

[OK]を、私はコメントを配置することができます - 私はすでに上記のテストコードを更新し、閉じたInputStreamを使用してもはや適用すべきではありません。上記のように連続して2回開くことは問題ではないはずです。 writeDownloadFileAlt()ベースのメソッドを介してダウンロードコンテンツを格納する場合、前述のように、内部ZIP構造がないため、最初にPOIを開くことはできません。 Excelでファイルを手動で開いて保存した後で、これは明らかに欠落しているアーカイブ構造を修正したに過ぎませんが、テストコードでは役に立ちません。 – fozzybear

関連する問題