Kể từ khi câu hỏi này và câu trả lời giúp tôi vài năm xuống dòng, tôi nghĩ rằng tôi muốn thêm gợi ý của riêng tôi, mà sẽ được assert
rằng dataPosition()
ở phần cuối của đọc cũng giống như ở cuối bài viết. Xây dựng trên Xilconic's answer:
@Test
public void testTestClassParcelable(){
TestClass test = new TestClass();
// Obtain a Parcel object and write the parcelable object to it:
Parcel parcel = Parcel.obtain();
test.writeToParcel(parcel, 0);
//>>>>> Record dataPosition
int eop = parcel.dataPosition();
// After you're done with writing, you need to reset the parcel for reading:
parcel.setDataPosition(0);
// Reconstruct object from parcel and asserts:
TestClass createdFromParcel = TestClass.CREATOR.createFromParcel(parcel);
assertEquals(test, createdFromParcel);
//>>>>> Verify dataPosition
assertEquals(eop, parcel.dataPosition());
}
Bối cảnh: này đến với tôi sau khi trải qua một (xấu hổ) số lượng thời gian gỡ một xấu Parcelable
. Trong trường hợp của tôi, writeToParcel
đã viết một trường trùng lặp từ một đối tượng trong một biểu đồ đối tượng phức tạp vừa phải. Do đó, các đối tượng sau được đọc không chính xác, đưa ra các ngoại lệ gây hiểu lầm và không có lỗi nào trong các thử nghiệm với đối tượng bị lỗi cụ thể.
Đó là một nỗi đau để theo dõi, và sau đó tôi nhận ra việc kiểm tra dataPosition
sẽ xác định được vấn đề nhanh hơn vì tôi có các thử nghiệm đối tượng bên trong cũng như vùng chứa chính.
Kotlin: Kể từ khi tôi đang làm việc trong Kotlin, một lambda nhỏ và reifying kỳ diệu:
class ParcelWrap<T>(val value: T)
val <T> T.parcel: ParcelWrap<T> get() = ParcelWrap(this)
inline fun <reified T: Parcelable> ParcelWrap<T>.test(
flags: Int = 0,
classLoader: ClassLoader = T::class.java.classLoader,
checks: (T) -> Unit
): T {
// Create the parcel
val parcel: Parcel = Parcel.obtain()
parcel.writeParcelable(this.value, flags)
// Record dataPosition
val eop = parcel.dataPosition()
// Reset the parcel
parcel.setDataPosition(0)
// Read from the parcel
val newObject = parcel.readParcelable<T>(classLoader)
// Perform the checks provided in the lambda
checks(newObject)
// Verify dataPosition
assertEquals("writeToParcel wrote too much data or read didn't finish reading", eop, parcel.dataPosition())
return newObject
}
bây giờ tôi có thể kiểm tra rất dễ dàng cùng những dòng này, nếu có một đầy đủ và đáng tin cậy equals()
:
testObject.parcel.test { assertEquals(testObject, it) }
Lưu ý rằng .parcel.test
tránh phải chỉ định lại thông số loại chung sử dụng this answer.
Hoặc, để biết thêm khẳng định phức tạp:
testObject.parcel.test {
assertEquals(123, it.id)
assertEquals("dewey", it.name)
// ...
}
Nếu một trong hai anwers của chúng tôi như một giải pháp cho vấn đề của bạn, xin vui lòng đánh dấu chúng là một câu trả lời chấp nhận :) – Xilconic