web-dev-qa-db-fra.com

les tests de hamcrest échouent toujours

J'utilise hamcrest 1.3 pour tester mon code. C'est simplement un dé. J'essaye de le tester pour m'assurer que le nombre généré est inférieur à 13. J'ai eu une déclaration d'impression qui a imprimé ce que le nombre généré était. Le nombre généré était toujours inférieur à 13 mais le test échouait toujours. Y a-t-il quelque chose que je fais mal?

C'est le code que je teste.

import Java.util.Random;

public class Die {
    private int numSides;
    Random Rand;

    public Die(int numSides){
        this.numSides = numSides;
        Rand = new Random(System.currentTimeMillis());
    }

    public int roll(){
        return Rand.nextInt(numSides) + 1;
    }
}

Et ceci est mon code de test.

import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.Test;

public class DieTest {
    @Test
    public void testRoll() {
        Die x = new Die(12);    
        assertThat(x.roll(), is(lessThan(13)));
    }
}

Edit: C'est la trace de la pile d'échec.

Java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package
at Java.lang.ClassLoader.checkCerts(Unknown Source)
at Java.lang.ClassLoader.preDefineClass(Unknown Source)
at Java.lang.ClassLoader.defineClassCond(Unknown Source)
at Java.lang.ClassLoader.defineClass(Unknown Source)
at Java.security.SecureClassLoader.defineClass(Unknown Source)
at Java.net.URLClassLoader.defineClass(Unknown Source)
at Java.net.URLClassLoader.access$000(Unknown Source)
at Java.net.URLClassLoader$1.run(Unknown Source)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at DieTest.testRoll(DieTest.Java:12)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at Java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:236)
at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:49)
at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)
41
beachw08

C'est le site qui m'aide à résoudre le problème.

http://code.google.com/p/hamcrest/issues/detail?id=128

Le fichier hamcrest.jar doit être placé avant la bibliothèque Junit dans le chemin de génération.

69
beachw08

Je viens de supprimer la bibliothèque JUnit de la configuration de mon projet. Je peux toujours exécuter les tests car JUnit est également inclus dans mon fichier pom. La solution utilise donc simplement la bibliothèque de Maven. 

13
Hunsu

Dans mon Eclipse dans Paramètres de projet de la section Chemin de construction Java, Bibliothèques, j'ai déjà ajouté une bibliothèque interne JUnit qui utilise JUnit version 4.8 et hamcrest-core version 1.1. Je crois que cela a causé cette erreur dans mon cas.

Je laisse cette information ici, peut-être que quelqu'un d'autre profiterait de mon expérience.

9
RockyMM

Utilisez junit-dep.jar plutôt que junit.jar- c'est JUnit moins ses dépendances. Junit.jar contient une ancienne version de Hamcrest.

6
Kkkev

Johan Mark (ci-dessus) a suggéré de 

renommez le fichier $Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar en quelque chose comme *.bak ou supprimez le fichier. "

Le fait de renommer/supprimer le fichier a entraîné l'arrêt de la bibliothèque Eclipse Junit, mais le remplacement du fichier JAR par une copie de la même version de mon référentiel Maven a permis de résoudre le problème du certificat.

(Comme quelqu'un sur Google l'a fait remarquer, la copie Eclipse Junit de hamcrest a un problème de certificat, mais pas la copie Maven ...)

4
Janneman

Tout d’abord, assurez-vous que vous avez ajouté la dépendance JUnit dans le fichier POM.xml.

Maintenant, cliquez avec le bouton droit sur le projet et allez dans les propriétés, sélectionnez le chemin de génération Java et sélectionnez l'onglet Bibliothèques. 

Dans mon cas, il y avait des dépendances Maven, des bibliothèques JRE et Junit4. Et je viens de retirer la bibliothèque Junit et cela fonctionne pour moi. On peut aussi réorganiser les bibliothèques en raison de l’ordre de compilation de Hamcrest et de JUnit4, le problème se posait.

4
imbond

Je recevais la même exception. Comme beachw08 recommandé, je me suis référé à:

http://code.google.com/p/hamcrest/issues/detail?id=128

L'un des posts disait:

renommez le fichier $ Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar en quelque chose comme * .bak ou supprimez le fichier.

Je l'ai fait et cela a résolu mon problème.

2
John Mark

Si vous utilisez un projet Maven, supprimez simplement la bibliothèque Junit du chemin de génération et importez plutôt Junit et Hamcrest séparément via POM. 

2
Avinav K

Si vous obtenez l'exception suivante "Java.lang.SecurityException: class" Les informations sur le signataire "org.hamcrest.Matchers" ne correspondent pas aux informations sur le signataire d'autres classes du même package ", assurez-vous que le fichier jar hamcrest se trouve avant la bibliothèque Junit dans le chemin de construction. Vous pouvez configurer la commande dans les propriétés du projet sous Chemin de construction Java sous l'onglet Ordre et exportation . Cliquez sur le lien de l'image pour plus de clarté: http://i.stack.imgur.com/Y5R15. png

2
Vaibhav Gupta

J'ai résolu ce problème en supprimant la bibliothèque Junit4 du chemin de construction, en ajoutant la bibliothèque TestNG au chemin de construction et en important des annotations TestNG au lieu des annotations Junit4 dans mon programme Java.

1
Jlearner

Celui-ci a résolu mon problème: 

Remplacez $ Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar par Maven ou le fichier hamcrest-core-xx.jar de votre projet (en le renommant évidemment sous le même nom que le fichier jar Eclipse)

0
Chetan Gole

J'ai fait ce qui suit:

D'abord dans le fichier pom, j'ai exclu hamcrest-core de la dépendance à Junit et utilisé à la place hamcrest-all. Deuxièmement, j’ai retiré du chemin de construction l’Eclipse JUNIT, qui remplace celui de Maven. La commande n'a pas affecté mes bocaux puisque le mauvais bocal a été exclu.

0
user666

Lorsque vous essayez de résoudre ce problème dans votre contexte particulier, n'oubliez pas que la trace de pile ci-dessus est simplement un symptôme. Les solutions peuvent fonctionner pour certaines personnes mais pas pour d'autres.

Par exemple:

  • Mettre le JAR Hamcrest avant le JAR JUnit dans le chemin de classe fonctionnera dans les situations où la version de JUnit utilisée (la plus ancienne) contient des classes Hamcrest.
  • Le fait de superposer à la version de Hamcrest utilisée en interne par Eclipse une version "stockée" renommée pour correspondre à la version interne peut fonctionner si aucun autre ensemble de plug-ins Eclipse n'utilise les informations de manifeste dans le fichier JAR interne d'origine. 

Dans mon cas, le symptôme ci-dessus a été provoqué par un fichier JAR Hamcrest utilisé en interne et fourni par Eclipse. Lorsque j'ai tenté de le remplacer par une version "stockée", aucun élément lié à JUnit n'a été chargé lorsque j'ai démarré Eclipse. Une fois que je suis revenu à la version interne d'origine, la SecurityException est revenue. La solution qui a fonctionné pour moi était de supprimer le manifeste dans le fichier JAR à l’aide de 7-Zip. Ceci efficacement "non signé" le JAR et maintenant ma configuration particulière fonctionne.

0
user6629913

j'ai récemment eu ce problème avec Eclipse et Junit. 

Pour résoudre ceci, j'ai fait ça:

1 - Téléchargez la dernière version de hamcrest-all à partir d’ici: https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/hamcrest/

2- Allez dans le dossier d’installation d’Eclipse: Eclipse/plugin/et trouvez le fichier org.hamcrest ...

3- Faites une sauvegarde du fichier jar step 2 et remplacez-le par le fichier jar step 1 (renommez-le de la même manière que le fichier jar step 2).

4- redémarrez Eclipse

Après cela, mon problème a été résolu.

0
Ravi NAGALINGAM

dans mon environnement Mac OS + Eclipse, j'ai trouvé org.hamcrest.core_1.3.0.v201303031735.jar dans mon JUnit 4,

donc je le supprime du chemin ~/.p2/pool/plugins /, puis actualise le projet, cela fonctionne.

0
jet.lau

Je suis allé dans les propriétés de construction du projet et ai changé JUNIT de la version 4 à la version 3 et cela fonctionne bien maintenant.

Fait intéressant, j'ai toujours la version 4 dans mon fichier pom.xml, donc je suis enclin à penser qu'il s'agit d'un problème lié à Eclipse (j'ai pu créer et exécuter mes tests via un terminal très bien).

0
jbunton10

Suppression de la bibliothèque JUNIT 4 de l'onglet "Librairies" sous Eclipse -> Java Le chemin de génération et tout a fonctionné.

0
Yogesh Samant

J'ai eu exactement le même problème. J'ai créé un nouveau projet et cela a résolu mon problème. 

J'ai eu le même problème que détaillé ici. Je crois que le problème vient du fichier jar junit4. 

Si, sous l'éditeur de pom Eclipse, vous regardez la hiérarchie junit4, vous verrez qu'il est dépendant de hamcrest-core (c'est-à-dire que hamcrest-core sera, par défaut, intégré à la compilation). Dans mon code de test unitaire, j'utilise la collection hamcrest Matchers (org.hamcrest.collection). Ceux-ci ne sont pas inclus dans le bocal principal et j'ai mis en place une dépendance sur hamcrest, le tout dans le pom. Faire cela duplique l'inclusion hamcrest-core et semble vous laisser ouvert à une incompatibilité de version avec la dépendance junit hamcrest-core et, partant, à l'exception de sécurité. J'ai supprimé la dépendance hamcrest-all et l'ai remplacée par hamcrest-library et l'exception est partie.

Si vous utilisez uniquement core hamcrest, vous ne devez pas configurer votre propre dépendance et vous fier à la version que Junit récupère. Autrement, comme suggéré dans un autre commentaire, utilisez junit-dep pour supprimer la dépendance Junit, puis inclure hamcrest-all.

0
Richard B

Si vous utilisez Maven:

Pas:

  1. Ajoutez la dernière dépendance au Hamcrest dans le POM à partir d’ici https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all

  2. Ajouter la dernière dépendance de JUnit dans POM à partir d’ici https://mvnrepository.com/artifact/junit/junit

  3. Supprimez toutes les bibliothèques JUnit du chemin de génération.

comme montré ici

et ici

  1. Après avoir terminé toutes les étapes ci-dessus, actualisez votre projet et exécutez-le.
0
PRITEN PATEL