Bonjour à tous, j'ai un problème sur lequel je me casse bien les dents en ce moment.

Je suis en train de tenter de mettre en place des tests unitaires sur le projet Android sur lequel je bosse. L'erreur survient entre le moment où les tests unitaires initient leur lancement et le déroulement des tests (j'ai l'impression qu'il y a une passe de réflexivité).
L'application cible Android 2.2+.

Niveau environnement, je suis sur IntelliJ Idea v12.1.4. L'application que je veux tester est assez conséquente niveau dépendance (10 modules et 6 bibliothèques).

Lorsque je tente de lancer des tests, j'ai une VerifyError pointant vers dom4J. J'ai testé un projet vide pour lancer des tests minimalistes, ça fonctionne. L'IDE n'est donc pas en cause.
J'ai testé un projet vide avec les mêmes dépendances en les ajoutant une à une. À chaque dépendance utilisant dom4J, j'ai eu de nouveau cette erreur.

En regardant sur le net, je n'ai trouvé aucune trace de ce problème sur Android.

Voici l'exception et ce qui la précède (ce qui semble être plus important pour ce type d'erreur) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
06-11 16:03:59.144: ERROR/dalvikvm(19876): Could not find class 'com.clarkware.junitperf.LoadTest', referenced from method org.dom4j.ThreadingTest.makeRepeatedLoadTest
06-11 16:03:59.144: WARN/dalvikvm(19876): VFY: unable to resolve new-instance 842 (Lcom/clarkware/junitperf/LoadTest;) in Lorg/dom4j/ThreadingTest;
06-11 16:03:59.144: DEBUG/dalvikvm(19876): VFY: replacing opcode 0x22 at 0x0012
06-11 16:03:59.148: DEBUG/dalvikvm(19876): DexOpt: unable to opt direct call 0x16ff at 0x14 in Lorg/dom4j/ThreadingTest;.makeRepeatedLoadTest
06-11 16:03:59.148: DEBUG/dalvikvm(19876): DexOpt: unable to opt direct call 0x1700 at 0x19 in Lorg/dom4j/ThreadingTest;.makeRepeatedLoadTest
06-11 16:03:59.211: INFO/dalvikvm(19876): Failed resolving Lorg/dom4j/datatype/DatatypeAttribute; interface 1532 'Lcom/sun/msv/datatype/SerializationContext;'
06-11 16:03:59.211: WARN/dalvikvm(19876): Link of class 'Lorg/dom4j/datatype/DatatypeAttribute;' failed
06-11 16:03:59.211: ERROR/dalvikvm(19876): Could not find class 'org.dom4j.datatype.DatatypeAttribute', referenced from method org.dom4j.datatype.SetDataTest.testAttribute
06-11 16:03:59.211: WARN/dalvikvm(19876): VFY: unable to resolve instanceof 2599 (Lorg/dom4j/datatype/DatatypeAttribute;) in Lorg/dom4j/datatype/SetDataTest;
06-11 16:03:59.214: DEBUG/dalvikvm(19876): VFY: replacing opcode 0x20 at 0x0021
06-11 16:03:59.214: INFO/dalvikvm(19876): Failed resolving Lorg/dom4j/datatype/DatatypeAttribute; interface 1532 'Lcom/sun/msv/datatype/SerializationContext;'
06-11 16:03:59.214: WARN/dalvikvm(19876): Link of class 'Lorg/dom4j/datatype/DatatypeAttribute;' failed
06-11 16:03:59.214: ERROR/dalvikvm(19876): Could not find class 'org.dom4j.datatype.DatatypeAttribute', referenced from method org.dom4j.datatype.SetDataTest.testAttributeWithNamespace
06-11 16:03:59.214: WARN/dalvikvm(19876): VFY: unable to resolve instanceof 2599 (Lorg/dom4j/datatype/DatatypeAttribute;) in Lorg/dom4j/datatype/SetDataTest;
06-11 16:03:59.214: DEBUG/dalvikvm(19876): VFY: replacing opcode 0x20 at 0x0029
06-11 16:03:59.226: ERROR/dalvikvm(19876): Could not find class 'com.clarkware.junitperf.LoadTest', referenced from method org.dom4j.util.PerThreadSingletonTest.makeRepeatedLoadTest
06-11 16:03:59.226: WARN/dalvikvm(19876): VFY: unable to resolve new-instance 842 (Lcom/clarkware/junitperf/LoadTest;) in Lorg/dom4j/util/PerThreadSingletonTest;
06-11 16:03:59.230: DEBUG/dalvikvm(19876): VFY: replacing opcode 0x22 at 0x0010
06-11 16:03:59.230: DEBUG/dalvikvm(19876): DexOpt: unable to opt direct call 0x16ff at 0x12 in Lorg/dom4j/util/PerThreadSingletonTest;.makeRepeatedLoadTest
06-11 16:03:59.230: DEBUG/dalvikvm(19876): DexOpt: unable to opt direct call 0x1700 at 0x17 in Lorg/dom4j/util/PerThreadSingletonTest;.makeRepeatedLoadTest
06-11 16:03:59.238: INFO/dalvikvm(19876): Could not find method javax.xml.stream.XMLInputFactory.newInstance, referenced from method org.dom4j.io.StaxTest.testEncoding
06-11 16:03:59.238: WARN/dalvikvm(19876): VFY: unable to resolve static method 13330: Ljavax/xml/stream/XMLInputFactory;.newInstance ()Ljavax/xml/stream/XMLInputFactory;
06-11 16:03:59.238: DEBUG/dalvikvm(19876): VFY: replacing opcode 0x71 at 0x0000
06-11 16:03:59.238: WARN/dalvikvm(19876): VFY: unable to resolve exception class 1832 (Ljavax/xml/stream/FactoryConfigurationError;)
06-11 16:03:59.238: WARN/dalvikvm(19876): VFY: unable to find exception handler at addr 0x4d
06-11 16:03:59.238: WARN/dalvikvm(19876): VFY:  rejected Lorg/dom4j/io/StaxTest;.testEncoding ()V
06-11 16:03:59.242: WARN/dalvikvm(19876): VFY:  rejecting opcode 0x0d at 0x004d
06-11 16:03:59.242: WARN/dalvikvm(19876): VFY:  rejected Lorg/dom4j/io/StaxTest;.testEncoding ()V
06-11 16:03:59.242: WARN/dalvikvm(19876): Verifier rejected class Lorg/dom4j/io/StaxTest;
06-11 16:03:59.242: DEBUG/AndroidRuntime(19876): Shutting down VM
06-11 16:03:59.242: WARN/dalvikvm(19876): threadid=1: thread exiting with uncaught exception (group=0x40e2e300)
06-11 16:03:59.246: ERROR/AndroidRuntime(19876): FATAL EXCEPTION: main
        java.lang.VerifyError: org/dom4j/io/StaxTest
        at java.lang.Class.getDeclaredConstructors(Native Method)
        at java.lang.Class.getConstructors(Class.java:498)
        at android.test.suitebuilder.TestGrouping$TestCasePredicate.hasValidConstructor(TestGrouping.java:228)
        at android.test.suitebuilder.TestGrouping$TestCasePredicate.apply(TestGrouping.java:217)
        at android.test.suitebuilder.TestGrouping$TestCasePredicate.apply(TestGrouping.java:213)
        at android.test.suitebuilder.TestGrouping.select(TestGrouping.java:172)
        at android.test.suitebuilder.TestGrouping.selectTestClasses(TestGrouping.java:162)
        at android.test.suitebuilder.TestGrouping.testCaseClassesInPackage(TestGrouping.java:156)
        at android.test.suitebuilder.TestGrouping.addPackagesRecursive(TestGrouping.java:117)
        at android.test.suitebuilder.TestSuiteBuilder.includePackages(TestSuiteBuilder.java:102)
        at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:366)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4142)
        at android.app.ActivityThread.access$1300(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
J'ai trouvé qu'on pouvait exclure une bibliothèque via le fichier excluded.properties de JUnit, mais celui-ci semble, dans le cas d'Android, être directement embarqué avec Android lui-même.
Source : http://junit.sourceforge.net/doc/faq/faq.htm#running_9

J'ai un peu tout épuisé, hormis le fait de remplacer dom4J dans l'appli et les lib l'utilisant, alors si quelqu'un à une idée...

Si des choses ne sont pas clair ou s'il y a besoin de précision, ne pas hésiter.