Wednesday, August 4, 2010

[android-developers] Re: AndroidTestCase fails with dependency on third project

I'm a bit confused here. You say that the tests run successfully in
the emulator, correct? Is this under Eclipse?

It looks as if you're getting class resolution errors in the Loader.
I'm not sure why this is happening, but I would guess that the class
loader is seeing the library classes in your test package, not your
main application. These classes may be out of sync with the classes
expected by the main application. Remember that in a test, you're
running both test and app in the same process, so the loader may not
try to load library classes twice.

Build the library into the main app and export the classes, and then
(I think this is right) make the test project dependent on the main
app but *not* the library project. I think that should work.

A.


On Aug 4, 2:45 am, Jeroen Kransen <jer...@kransen.nl> wrote:
> I have a and Android project and its test project. I can run tests
> successfully in the emulator. As the Android project has dependencies
> on a third library project, I want to use classes of the third project
> in the test cases too. For this, I need to add a dependency from the
> test project to the third project as well. Compile-time this works,
> but when I do a remote run of my AndroidTestCase, all tests fail. For
> each test, I get a NoClassDefFoundError, but not for third project
> classes, but for a class in the Android project itself!
>
> In the LogCat I also get very interesting messages:
>
> 08-04 09:27:35.163: WARN/dalvikvm(817): Class resolved by unexpected
> DEX: Lnl/kransen/consumption/android/dao/MeasurementDaoImpl;
> (0x43d0c940):0x136900 ref [Lnl/kransen/consumption/dao/
> MeasurementDao;] Lnl/kransen/consumption/dao/MeasurementDao;
> (0x43d0c940):0x116b20
> 08-04 09:27:35.163: WARN/dalvikvm(817): (Lnl/kransen/consumption/
> android/dao/MeasurementDaoImpl; had used a different Lnl/kransen/
> consumption/dao/MeasurementDao; during pre-verification)
> 08-04 09:27:35.172: INFO/dalvikvm(817): Failed resolving Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl; interface 127 'Lnl/kransen/
> consumption/dao/MeasurementDao;'
> 08-04 09:27:35.172: WARN/dalvikvm(817): Link of class 'Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl;' failed
> 08-04 09:27:35.172: ERROR/dalvikvm(817): Could not find class
> 'nl.kransen.consumption.android.dao.MeasurementDaoImpl', referenced
> from method
> nl.kransen.consumption.android.test.MeterstandenDaoImplTest.setUp
> 08-04 09:27:35.182: WARN/dalvikvm(817): VFY: unable to resolve new-
> instance 41 (Lnl/kransen/consumption/android/dao/MeasurementDaoImpl;)
> in Lnl/kransen/consumption/android/test/MeterstandenDaoImplTest;
> 08-04 09:27:35.182: DEBUG/dalvikvm(817): VFY: replacing opcode 0x22 at
> 0x000c
> 08-04 09:27:35.192: DEBUG/dalvikvm(817): Making a copy of Lnl/kransen/
> consumption/android/test/MeterstandenDaoImplTest;.setUp code (64
> bytes)
> 08-04 09:27:35.192: WARN/dalvikvm(817): Class resolved by unexpected
> DEX: Lnl/kransen/consumption/android/dao/MeasurementDaoImpl;
> (0x43d0c940):0x136900 ref [Lnl/kransen/consumption/dao/
> MeasurementDao;] Lnl/kransen/consumption/dao/MeasurementDao;
> (0x43d0c940):0x116b20
> 08-04 09:27:35.203: WARN/dalvikvm(817): (Lnl/kransen/consumption/
> android/dao/MeasurementDaoImpl; had used a different Lnl/kransen/
> consumption/dao/MeasurementDao; during pre-verification)
> 08-04 09:27:35.203: INFO/dalvikvm(817): Failed resolving Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl; interface 127 'Lnl/kransen/
> consumption/dao/MeasurementDao;'
> 08-04 09:27:35.213: WARN/dalvikvm(817): Link of class 'Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl;' failed
> 08-04 09:27:35.222: WARN/dalvikvm(817): Class resolved by unexpected
> DEX: Lnl/kransen/consumption/android/dao/MeasurementDaoImpl;
> (0x43d0c940):0x136900 ref [Lnl/kransen/consumption/dao/
> MeasurementDao;] Lnl/kransen/consumption/dao/MeasurementDao;
> (0x43d0c940):0x116b20
> 08-04 09:27:35.222: WARN/dalvikvm(817): (Lnl/kransen/consumption/
> android/dao/MeasurementDaoImpl; had used a different Lnl/kransen/
> consumption/dao/MeasurementDao; during pre-verification)
> 08-04 09:27:35.222: INFO/dalvikvm(817): Failed resolving Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl; interface 127 'Lnl/kransen/
> consumption/dao/MeasurementDao;'
> 08-04 09:27:35.222: WARN/dalvikvm(817): Link of class 'Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl;' failed
> 08-04 09:27:35.232: INFO/dalvikvm(817): Could not find method
> nl.kransen.consumption.android.dao.MeasurementDaoImpl.close,
> referenced from method
> nl.kransen.consumption.android.test.MeterstandenDaoImplTest.tearDown
> 08-04 09:27:35.232: WARN/dalvikvm(817): VFY: unable to resolve virtual
> method 80: Lnl/kransen/consumption/android/dao/
> MeasurementDaoImpl;.close ()V
> 08-04 09:27:35.232: DEBUG/dalvikvm(817): VFY: replacing opcode 0x6e at
> 0x0002
> 08-04 09:27:35.244: DEBUG/dalvikvm(817): Making a copy of Lnl/kransen/
> consumption/android/test/MeterstandenDaoImplTest;.tearDown code (28
> bytes)
> 08-04 09:27:35.244: WARN/dalvikvm(817): Class resolved by unexpected
> DEX: Lnl/kransen/consumption/android/dao/MeasurementDaoImpl;
> (0x43d0c940):0x136900 ref [Lnl/kransen/consumption/dao/
> MeasurementDao;] Lnl/kransen/consumption/dao/MeasurementDao;
> (0x43d0c940):0x116b20
> 08-04 09:27:35.253: WARN/dalvikvm(817): (Lnl/kransen/consumption/
> android/dao/MeasurementDaoImpl; had used a different Lnl/kransen/
> consumption/dao/MeasurementDao; during pre-verification)
> 08-04 09:27:35.253: INFO/dalvikvm(817): Failed resolving Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl; interface 127 'Lnl/kransen/
> consumption/dao/MeasurementDao;'
> 08-04 09:27:35.263: WARN/dalvikvm(817): Link of class 'Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl;' failed
> 08-04 09:27:35.263: WARN/dalvikvm(817): Class resolved by unexpected
> DEX: Lnl/kransen/consumption/android/dao/MeasurementDaoImpl;
> (0x43d0c940):0x136900 ref [Lnl/kransen/consumption/dao/
> MeasurementDao;] Lnl/kransen/consumption/dao/MeasurementDao;
> (0x43d0c940):0x116b20
> 08-04 09:27:35.273: WARN/dalvikvm(817): (Lnl/kransen/consumption/
> android/dao/MeasurementDaoImpl; had used a different Lnl/kransen/
> consumption/dao/MeasurementDao; during pre-verification)
> 08-04 09:27:35.273: INFO/dalvikvm(817): Failed resolving Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl; interface 127 'Lnl/kransen/
> consumption/dao/MeasurementDao;'
> 08-04 09:27:35.273: WARN/dalvikvm(817): Link of class 'Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl;' failed
> 08-04 09:27:35.273: INFO/dalvikvm(817): Could not find method
> nl.kransen.consumption.android.dao.MeasurementDaoImpl.saveMeasurement,
> referenced from method
> nl.kransen.consumption.android.test.MeterstandenDaoImplTest.testAddMeasurem ent
> 08-04 09:27:35.283: WARN/dalvikvm(817): VFY: unable to resolve virtual
> method 81: Lnl/kransen/consumption/android/dao/
> MeasurementDaoImpl;.saveMeasurement (Lnl/kransen/consumption/
> Measurement;)V
> 08-04 09:27:35.292: DEBUG/dalvikvm(817): VFY: replacing opcode 0x6e at
> 0x001f
> 08-04 09:27:35.292: DEBUG/dalvikvm(817): Making a copy of Lnl/kransen/
> consumption/android/test/MeterstandenDaoImplTest;.testAddMeasurement
> code (88 bytes)
> 08-04 09:27:35.292: WARN/dalvikvm(817): Class resolved by unexpected
> DEX: Lnl/kransen/consumption/android/dao/MeasurementDaoImpl;
> (0x43d0c940):0x136900 ref [Lnl/kransen/consumption/dao/
> MeasurementDao;] Lnl/kransen/consumption/dao/MeasurementDao;
> (0x43d0c940):0x116b20
> 08-04 09:27:35.292: WARN/dalvikvm(817): (Lnl/kransen/consumption/
> android/dao/MeasurementDaoImpl; had used a different Lnl/kransen/
> consumption/dao/MeasurementDao; during pre-verification)
> 08-04 09:27:35.292: INFO/dalvikvm(817): Failed resolving Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl; interface 127 'Lnl/kransen/
> consumption/dao/MeasurementDao;'
> 08-04 09:27:35.292: WARN/dalvikvm(817): Link of class 'Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl;' failed
> 08-04 09:27:35.343: INFO/TestRunner(817): started:
> testAddMeasurement(nl.kransen.consumption.android.test.MeterstandenDaoImplT est)
> 08-04 09:27:35.392: INFO/TestRunner(817): finished:
> testAddMeasurement(nl.kransen.consumption.android.test.MeterstandenDaoImplT est)
> 08-04 09:27:35.392: INFO/TestRunner(817): passed:
> testAddMeasurement(nl.kransen.consumption.android.test.MeterstandenDaoImplT est)
> 08-04 09:27:35.404: INFO/TestRunner(817): started:
> testDaoPresent(nl.kransen.consumption.android.test.MeterstandenDaoImplTest)
> 08-04 09:27:35.422: INFO/TestRunner(817): finished:
> testDaoPresent(nl.kransen.consumption.android.test.MeterstandenDaoImplTest)
> 08-04 09:27:35.422: INFO/TestRunner(817): passed:
> testDaoPresent(nl.kransen.consumption.android.test.MeterstandenDaoImplTest)
> 08-04 09:27:35.433: INFO/TestRunner(817): started:
> testAndroidTestCaseSetupProperly(nl.kransen.consumption.android.test.Meters tandenDaoImplTest)
> 08-04 09:27:35.453: INFO/TestRunner(817): finished:
> testAndroidTestCaseSetupProperly(nl.kransen.consumption.android.test.Meters tandenDaoImplTest)
> 08-04 09:27:35.453: INFO/TestRunner(817): passed:
> testAndroidTestCaseSetupProperly(nl.kransen.consumption.android.test.Meters tandenDaoImplTest)
>
> So it says all tests "passed", although the class MeasurementDaoImpl
> was not found?
>
> Then immediately after that, it seems to run the tests again, but then
> they fail:
>
> 08-04 09:36:15.562: WARN/dalvikvm(878): Class resolved by unexpected
> DEX: Lnl/kransen/consumption/android/dao/MeasurementDaoImpl;
> (0x43d0c940):0x125890 ref [Lnl/kransen/consumption/dao/
> MeasurementDao;] Lnl/kransen/consumption/dao/MeasurementDao;
> (0x43d0c940):0x11fb40
> 08-04 09:36:15.562: WARN/dalvikvm(878): (Lnl/kransen/consumption/
> android/dao/MeasurementDaoImpl; had used a different Lnl/kransen/
> consumption/dao/MeasurementDao; during pre-verification)
> 08-04 09:36:15.573: INFO/dalvikvm(878): Failed resolving Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl; interface 127 'Lnl/kransen/
> consumption/dao/MeasurementDao;'
> 08-04 09:36:15.583: WARN/dalvikvm(878): Link of class 'Lnl/kransen/
> consumption/android/dao/MeasurementDaoImpl;' failed
> 08-04 09:36:15.583: ERROR/dalvikvm(878): Could not find class
> 'nl.kransen.consumption.android.dao.MeasurementDaoImpl', referenced
> from method
> nl.kransen.consumption.android.test.MeterstandenDaoImplTest.setUp
> 08-04 09:36:15.592: WARN/dalvikvm(878): VFY: unable to resolve new-
> instance 41 (Lnl/kransen/consumption/android/dao/MeasurementDaoImpl;)
> in Lnl/kransen/consumption/android/test/MeterstandenDaoImplTest;
> 08-04 09:36:15.592: DEBUG/dalvikvm(878): VFY: replacing opcode 0x22 at
> 0x000c
> 08-04 09:36:15.592: DEBUG/dalvikvm(878): Making a copy of Lnl/kransen/
> consumption/android/test/MeterstandenDaoImplTest;.setUp code (64
> bytes)
> 08-04 09:36:15.603: WARN/dalvikvm(878): Class resolved by ...
>
> read more »

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

No comments:

Post a Comment