vendredi 19 janvier 2018

Testing parcel read write with mocked dependencies

I am trying to test my parcel implementation in some model class i have made, with mocked dependencies. However, every time i initialize it with said mocked dependencies, and then write, and read, it to a parcel, i get a Class not found when unmarshalling: Interval_Proxy exception for my class Alarm, with mocked dependency Interval.

The problem is probably that in my parcel read implementation, i am using an Interval class loader when reading that particular dependency, even though the mock makes it into an Interval_Proxy type, but i really have no idea.

Can anyone shred some light on this?

My test:

UUID id = UUID.fromString("feb33f17-8512-4416-b376-84fd0bb603ef");
Date date = mock(Date.class);
Interval interval = mock(Interval.class);
Prescription prescription = mock(Prescription.class);

Alarm alarm = new Alarm(id, date, interval, prescription, false, false);

Parcel parcel = Parcel.obtain();
alarm.writeToParcel(parcel, 0);
parcel.setDataPosition(0);

Alarm parceledAlarm = Alarm.CREATOR.createFromParcel(parcel);

assertThat(alarm.getId(), is(id));
assertThat(alarm.getDate(), is(date));
assertThat(alarm.getInterval(), is(interval));
assertThat(alarm.getPrescription(), is(prescription));
assertThat(alarm.isDismissed(), is(false));
assertThat(alarm.isDismissed(), is(false));

assertThat(alarm, is(parceledAlarm));

My alarm parcel read and write:

protected Alarm(Parcel in) {
    id = ((ParcelUuid) in.readParcelable(ParcelUuid.class.getClassLoader())).getUuid();
    checked = in.readByte() != 0;
    dismissed = in.readByte() != 0;
    interval = in.readParcelable(Interval.class.getClassLoader());
    prescription = in.readParcelable(Prescription.class.getClassLoader());
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeParcelable(new ParcelUuid(id), flags);
    dest.writeByte((byte) (checked ? 1 : 0));
    dest.writeByte((byte) (dismissed ? 1 : 0));
    dest.writeParcelable(interval, flags);
    dest.writeParcelable(prescription, flags);
}

The exception thrown:

E/Parcel: Class not found when unmarshalling: Interval_Proxy
      java.lang.ClassNotFoundException: Interval_Proxy
          at java.lang.Class.classForName(Native Method)
          at java.lang.Class.forName(Class.java:453)
          at android.os.Parcel.readParcelableCreator(Parcel.java:2818)
          at android.os.Parcel.readParcelable(Parcel.java:2772)
          at com.rasive.pillreminder.models.Alarm.<init>(Alarm.java:46)
          at com.rasive.pillreminder.models.Alarm$1.createFromParcel(Alarm.java:67)
          at com.rasive.pillreminder.models.Alarm$1.createFromParcel(Alarm.java:64)
          at com.rasive.pillreminder.AlarmTest_Parcelable.createParcel(AlarmTest_Parcelable.java:37)
          at java.lang.reflect.Method.invoke(Native Method)
          at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
          at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
          at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
          at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
          at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
          at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
          at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
          at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
          at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
          at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
          at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
          at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
          at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
          at org.junit.runners.Suite.runChild(Suite.java:128)
          at org.junit.runners.Suite.runChild(Suite.java:27)
          at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
          at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
          at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
          at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
          at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
          at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
          at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
          at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
          at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
          at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
          at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
       Caused by: java.lang.ClassNotFoundException: Didn't find class "Interval_Proxy" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.rasive.pill_reminder.test-y_qRLspX6rV77YcK6XvlOQ==/base.apk", zip file "/data/app/com.rasive.pill_reminder-x2CBSuyy8_Rbcx9mOQPmSg==/base.apk"],nativeLibraryDirectories=[/data/app/com.rasive.pill_reminder.test-y_qRLspX6rV77YcK6XvlOQ==/lib/x86, /data/app/com.rasive.pill_reminder-x2CBSuyy8_Rbcx9mOQPmSg==/lib/x86, /system/lib, /vendor/lib]]

Aucun commentaire:

Enregistrer un commentaire