IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème tests unitaires avec dom4J


Sujet :

Android

  1. #1
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut Problème tests unitaires avec dom4J
    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.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    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...
    Flute... c'est exactement ce que j'allais proposer, utiliser une autre librairie pour les tests...


    Bon sinon, le VerifyError, c'est un problème d'utilisation de librairie dans 99% des cas:
    pas la bonne version de java, genre une lib compilée avec java 7, runnée dans java 6, etc...
    utilisation d'une lib Toto v2 dans la compilation, et d'une lib Toto v1 dans l'execution....
    Ou simplement la taille du code d'une fonction qui est trop grande.

    etc...

    Le pire dans android c'est d'utiliser une librairie compilée avec le JDK oracle dans un run compilé avec le JDK d'android (dalvik). C'est pourquoi, sous Android, on peut difficilement utiliser les "jar" binaires des librairies trouvées sur le net, on est presque systématiquement obligé d'en compiler les sources.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ca, c'est confirmé au vu des messages que j'ai durant la compil'.

    La lib qui est utilisée a été prise et compilée pour une JVM standard, pas pour Dalvik (je ne crois pas qu'il y ait de dom4J spécifique, pas trouvé sinon).
    Par contre, je crois avoir totalement zappé de regarder s'il était possible ou non de la recréer à partir de sources pour cibler spécifiquement Dalvik.

    warning: Ignoring InnerClasses attribute for an anonymous inner class (org.dom4j.dom.DOMNodeHelper$1) that doesn't come with an
    associated EnclosingMethod attribute. This class was probably produced by a compiler that did not target the modern .class file format. The recommended solution is to recompile the class from source, using an up-to-date compiler and without specifying any "-target" type options. The consequence of inoring his warning is that reflective operations on this class will incorrectly indicate that it is *not* an inner class.
    Remplacer dom4J dans le projet ne devrait pas être trop long je pense (temps de test compris), mais le souci est que cette lib est utilisée dans des libs internes qui impactent tout les autres projets... la remplacer uniquement dans mon projet ne servira en soit à rien et la remplacer partout me semble être la seule solution viable à terme.

    Je vais devoir voir (quand je pourrai, je suis passé sur autre chose entre temps) pour recompiler dom4J en ciblant Dalvik (ça va être une première... je vais m'amuser ).
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

Discussions similaires

  1. Test unitaire avec DUnit
    Par stef_chand dans le forum Outils
    Réponses: 1
    Dernier message: 07/09/2007, 15h40
  2. Test unitaire avec C# et nunit
    Par jeromechezgdf dans le forum C#
    Réponses: 6
    Dernier message: 16/07/2007, 11h51
  3. Tests unitaires avec vbUnit sur des contrôles utilisateurs
    Par Patrick Mortas dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 07/09/2006, 18h06
  4. test unitaire avec python
    Par Abla23 dans le forum Zope
    Réponses: 4
    Dernier message: 30/06/2006, 13h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo