2016-12-18 4 views
1

Ich erstelle einen JUnitTest Test, der eine Datei vergleicht, die mit einer Benchmark-Datei erstellt wurde, die sich im Ordner "" in Eclipse im Ordner "Resources" befindet.Java - InputStreams zweier identischer Dateien vergleichen

-Code

public class CompareFileTest 
{ 
    private static final String TEST_FILENAME = "/resources/CompareFile_Test_Output.xls"; 

@Test 
public void testCompare() 
{ 
    InputStream outputFileInputStream = null; 
    BufferedInputStream bufferedInputStream = null; 

    File excelOne = new File(StandingsCreationHelper.directoryPath + "CompareFile_Test_Input1.xls"); 
    File excelTwo = new File(StandingsCreationHelper.directoryPath + "CompareFile_Test_Input1.xls"); 
    File excelThree = new File(StandingsCreationHelper.directoryPath + "CompareFile_Test_Output.xls"); 

    CompareFile compareFile = new CompareFile(excelOne, excelTwo, excelThree); 

    // The result of the comparison is stored in the excelThree file 
    compareFile.compare(); 

    try 
    { 
     outputFileInputStream = new FileInputStream(excelThree); 
     bufferedInputStream = new BufferedInputStream(outputFileInputStream); 

     assertTrue(IOUtils.contentEquals(CompareFileTest.class.getResourceAsStream(TEST_FILENAME), bufferedInputStream)); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 

Allerdings erhalte ich eine Nachricht Assertion Fehler, ohne Details. Da ich gerade die Benchmark-Datei aus der Operation compare file erstellt habe, sollten beide Dateien identisch sein.

Vielen Dank im Voraus!

EDIT: Nach Slim Kommentare habe ich eine Datei Diff-Tool und festgestellt, dass beide Dateien unterschiedlich sind, obwohl, da sie Kopien sind, ich bin mir nicht sicher, wie das passiert ist. Vielleicht gibt es einen Zeitstempel oder etwas?

+1

extrahieren Sie 'CompareFileTest.class.getResourceAsStream (TEST_FILENAME)' in eine Variable und überprüfen Sie, dass es nicht null ist. – roby

+0

@roby Es ist leider nicht null. –

+0

Als nächstes könnten Sie beide Dateien in String konvertieren und assertEquals ausprobieren. Sie könnten 'IOUtils.toString (InputStream, Charset)' verwenden. – roby

Antwort

2

IOUtils.contentEquals() erhebt keinen Anspruch darauf, Ihnen mehr Informationen zu geben als ein boolescher Wert "stimmt überein oder stimmt nicht überein", so dass Sie keine zusätzlichen Informationen erhalten können.

Wenn Ihr Ziel nur darin besteht, herauszufinden, warum diese beiden Dateien unterschiedlich sind, könnten Sie von Java abweichen und andere Tools verwenden, um die Dateien zu vergleichen. Zum Beispiel https://superuser.com/questions/125376/how-do-i-compare-binary-files-in-linux

Wenn Ihr Ziel ist für Ihre JUnit-Tests benötigen mehr Informationen geben, wenn die Dateien nicht übereinstimmen (zum Beispiel könnte die Ausnahme Expected files to match, but byte 5678 differs [0xAE] vs [0xAF] sagen), müssen Sie etwas anderes als IOUtils.contentEquals() verwenden - durch Walzen eigene oder auf der Suche nach etwas passendem in Comparing text files w/ Junit

+0

Vielen Dank für die Antwort! Da ich zwei Excel-Dateien vergleiche, hoffe ich nicht auf detaillierte Fehlermeldungen, welche Bytes falsch sind, da ich sie sowieso nicht verstehen kann. Mein Problem ist, dass beide Dateien übereinstimmen sollten, da sie eine direkte Kopie von einander sind, und ich verstehe nicht, warum Java für den Vergleich falsch zurückgibt. –

+1

Sind Sie absolut sicher, dass 'StandingsCreationHelper.directoryPath + "CompareFile_Test_Output.xls" 'und'/resources/CompareFile_Test_Output.xls' auf die gleiche Datei verweisen? Validate with http://stackoverflow.com/questions/17351043/how-to-get-absolute-path-to-file-in-resources-folder-in-your-project – slim

+0

Sie zeigen nicht auf die gleiche Datei, aber sie zeigen auf Dateien, die identisch sind. –

Verwandte Themen