我正在寻找有关如何使用JUnit测试动态生成的图像是预期图像的方向。一点背景:
我有生成缩略图的代码,如java.awt.image.BufferedImage,并将这些BufferedImages存储到java.io.File对象中。
我写了一个简单的单元测试来检查一些关键项目,以确保生成的图像是正确的:
@Test
public void testGenerateDefaultThumbnail() {
File file = // someGeneratedFile.jpg
assertNotNull(file);
assertEquals(10211l, file.length());
}
基本上,我只是确认文件大小符合我的预期。
这在我的机器(Mac OSX)上本地工作正常,但是只要我们的测试在我们的构建服务器(Ubuntu)上运行,其中一个测试就会失败并显示以下内容:
java.lang.AssertionError: expected:<10211> but was:<10158>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:743)
at org.junit.Assert.assertEquals(Assert.java:118)
at org.junit.Assert.assertEquals(Assert.java:555)
at org.junit.Assert.assertEquals(Assert.java:542)
at c.v.t.ThumbnailTest.testGenerateDefaultThumbnail(ThumbnailTest.java:53)
三部分问题:
谢谢!
答案 0 :(得分:8)
我猜这里写出的元数据存在差异吗?图像数据可能是相同的。如果您只关心图像数据而不关心图像文件的元数据,您可以将像素数据拉出为字节数组。
无论如何,这可能是个好主意,因为比较整个文件会有问题,因为元数据可能包含文件生成的时间戳,这将打破测试。如果您已将图片作为BufferedImage
,则可以在expected
和actual
变量上执行此操作。
//this gets the actual Raster data as a byte array
byte[] byteArray = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData();
然后只比较字节数组的相等性
assertArrayEqual(expectedArray, actualArray);
如果您没有将数据作为bufferedImage,但是从文件中轻松获取数据
BufferedImage originalImage =
ImageIO.read(new File("path/to/my.jpg"));
或InputStream
try{
BufferedImage originalImage =
ImageIO.read(inputStream));
}finally{
//close inputstream
inputStream.close();
}