单元测试:比较文件生成断言返回false

时间:2018-06-07 07:45:08

标签: java unit-testing

我尝试编写单元测试来测试我的xlsx文件生成。 我将一个有效的文件存储在测试资源中,然后尝试生成相同的文件并进行比较。

InputStream xlsxContent = xlsxContentWriter.generateXlsx(getSamples(10), RawEventDto.class);
InputStream file = new ByteArrayInputStream(Files.readAllBytes(Paths.get(ClassLoader.getSystemResource("test.xlsx").toURI())));
Assert.assertEquals(IOUtils.toByteArray(file), IOUtils.toByteArray(xlsxContent));

问题:断言返回false。

为了确保生成的文件与资源中的文件相同,我将生成的文件本身保存在资源中,所以它显然是相同的:

InputStream xlsxContent = xlsxContentWriter.generateXlsx(getSamples(10), RawEventDto.class);           
File targetFile = new File("/home/user/test.xlsx");
OutputStream outStream = new FileOutputStream(targetFile);
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = xlsxContent.read(buffer)) !=-1){
      outStream.write(buffer, 0, bytesRead);
}
xlsxContent.close();
outStream.flush();
outStream.close();

知道为什么这会返回false吗?有关文件的任何技巧吗?

修改:

现在我的代码:

           InputStream file = new ByteArrayInputStream(Files.readAllBytes(Paths.get(ClassLoader.getSystemResource("test.xlsx").toURI())));
        byte[] byteArray1 = IOUtils.toByteArray(file);
        byte[] byteArray2 = IOUtils.toByteArray(xlsxContent);


        Assert.assertEquals(IOUtils.toByteArray(file).length, IOUtils.toByteArray(xlsxContent).length);
        Assert.assertTrue(Arrays.equals(byteArray1,byteArray2));

但我仍然断言=假,实际上我得到了这个错误:

  

java.lang.AssertionError:null at   org.junit.Assert.fail(Assert.java:86)at   org.junit.Assert.assertTrue(Assert.java:41)at   org.junit.Assert.assertTrue(Assert.java:52)at   com.renault.hsmt.util.test.XlsxContentWriterTest.testXlsxWrite(XlsxContentWriterTest.java:61)

实际上,即使这段代码也会返回false(我将生成的文件与自身进行比较,而不是从资源文件夹中获取):

InputStream xlsxContent = xlsxContentWriter.generateXlsx(getSamples(10), RawEventDto.class);
            byte[] byteArray1 = IOUtils.toByteArray(xlsxContent);
            byte[] byteArray2 = IOUtils.toByteArray(xlsxContent);


            Assert.assertEquals(IOUtils.toByteArray(xlsxContent).length, IOUtils.toByteArray(xlsxContent).length);
            Assert.assertTrue(Arrays.equals(byteArray1,byteArray2));

2 个答案:

答案 0 :(得分:2)

你不会像这样比较2字节数组,而是使用Arrays.equals,例如:

public static void main(String[] args) {
    byte[] a = {0,1};
    byte[] b = {0,1};
    System.out.println(a.equals(b)); //false
    System.out.println(Arrays.equals(a, b)); //true
}
在你的情况下,它将是:

  Assert.assertTrue(Arrays.equals(IOUtils.toByteArray(file), IOUtils.toByteArray(xlsxContent)));

答案 1 :(得分:1)

如果您使用的是JUnit 5,则只需拨打

即可
Assertions.assertArrayEquals(array1,array2);

JUnit5 Assertions documentation