Java 将base64映像与InputStream进行比较
我正在测试我的android应用程序。 在Java 将base64映像与InputStream进行比较,java,junit,base64,inputstream,Java,Junit,Base64,Inputstream,我正在测试我的android应用程序。 在setUp()上,我创建了3个联系人,其中两个有照片。插入的第一个联系人和最后一个联系人都有一张照片。联系人的信息通过JSON对象接收,图像以base64编码 我有95%的把握这两张图片是一样的,我只是用解码得到了我期待的图片 在tearDown()上,我正在删除联系人 我被一种特殊的方法困住了。这个: public void testGetContactPhotoInputStream() { try { String pho
setUp()
上,我创建了3个联系人,其中两个有照片。插入的第一个联系人和最后一个联系人都有一张照片。联系人的信息通过JSON对象
接收,图像以base64编码
我有95%的把握这两张图片是一样的,我只是用解码得到了我期待的图片
在tearDown()
上,我正在删除联系人
我被一种特殊的方法困住了。这个:
public void testGetContactPhotoInputStream() {
try {
String photoBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeIAAAC2CAIAAACK4xmhAAAABmJLR0Q(...)";
String rawContactId = getAllRawContactIds().get(0);
photo.setRawContactId(rawContactId);
InputStream isExpected = photo.getContactPhotoInputStream();
InputStream isActual = new ByteArrayInputStream(Base64.decode(photoBase64.getBytes(), Base64.DEFAULT));
assertTrue(IOUtils.contentEquals(isExpected, isActual));
} catch (IOException e) {
e.printStackTrace();
fail("Exception: " + e.getMessage());
}
}
它正在从Photo
类测试此方法
public InputStream getContactPhotoInputStream() throws IOException {
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(mRawContactId));
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri);
return is;
}
我确信照片是一样的,因为base64编码是接收到的JSON
中的字符串
我试过:
String photoBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeIAAAC2CAIAAACK4xmhAAAABmJLR0QA/wD/AP(...)";
没有“data:image/png…”的初始部分,如下所示:
String photoBase64 = "iVBORw0KGgoAAAANSUhEUgAAAeIAAAC2CAIAAACK4xmhAAAABmJLR0QA/wD/AP(...)";
仍然获取失败的断言
这是我的断言
输出:
junit.framework.AssertionFailedError
at com.pedro.notesquirrel.test.PhotoTest.testGetContactPhotoInputStream(PhotoTest.java:178)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
我认为问题在于转换为InputStream
,但我看不出断言失败的任何原因
有什么帮助吗
聚苯乙烯;为了便于阅读,我删除了大部分的photoBase64
字符串
///////////EDIT/////////////////strong>
以下是Joop Eggen的评论,以下是我的代码:
public void testGetContactPhotoInputStream() {
try {
String photoBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeIAAAC2CAIAAACK4xmhAAA(...)";
String contactId = getAllContactIds().get(0);
String rawContactId = contact.getAllRawContactIdsBelongingToGivenContactId(contactId).get(0);
photo.setRawContactId(rawContactId);
photoBase64 = photoBase64.replaceFirst("^.*;base64,", "");
Log.d(TAG, "Data: " + photoBase64);
byte[] bytes = Base64.decode(photoBase64, Base64.DEFAULT);
InputStream isActual = new ByteArrayInputStream(bytes);
InputStream isExpected = photo.getContactPhotoInputStream();
assertTrue(IOUtils.contentEquals(isExpected, isActual));
} catch (IOException e) {
e.printStackTrace();
fail("Exception: " + e.getMessage());
}
}
“data:image/png;base64”部分不属于真正的base64数据
String base64Text = photoBase64.replaceFirst("^.*,", "");
byte[] bytes = Base64.decode(base64Text , Base64.DEFAULT);
好吧,我们“眼睛”的图像是相等的(不完全相等,因为你可以看到一些模糊的像素),但Android内部确实降低了图像质量,使其与原始图像不匹配。因此,单元测试失败。执行此转换。@JoopEggen我已尝试按照您的建议进行操作,但仍然无法进行资产评估。我用你评论中的代码编辑了我的问题。Android没有类DatatypeConverter
,它有Base64
类。检查图像中存储的元信息,可能它们已更改。2.做一个十六进制转储并比较它们。是的,你是对的。Android确实改变了图像。它会降低图像质量,使其与原始图像不匹配。我知道,在这两种情况下,为了让我安心,我测试了有无“data:image/png;base64”,但都不起作用。我最终得到了我的输入流isExpected
编码为base64并对其进行了分析。我的结论是,InputStream是预期的
不是我应该得到的,因此测试按预期失败。感谢您的帮助和投入,代表给予!