it-swarm.com.de

hamcrest-Tests schlagen immer fehl

Ich verwende hamcrest 1.3, um meinen Code zu testen. Es ist einfach ein Würfel. Ich versuche es zu testen, um sicherzustellen, dass die erzeugte Anzahl unter 13 liegt. Die generierte Anzahl war immer unter 13, aber der Test schlug fehl. Gibt es etwas, was ich falsch mache?

Dies ist der Code, den ich 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;
    }
}

Und das ist mein Testcode.

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)));
    }
}

Bearbeiten: Dies ist die Ablaufverfolgung des Fehlerstapels.

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

Diese Seite hilft mir, das Problem zu lösen.

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

Die Datei hamcrest.jar muss sich vor der Junit-Bibliothek im Erstellungspfad befinden.

69
beachw08

Ich habe gerade die JUnit-Bibliothek aus meiner Projektkonfiguration entfernt. Ich kann die Tests immer noch ausführen, da JUnit auch in meiner Pom-Datei enthalten ist. Die Lösung nutzt also einfach die Bibliothek von Maven. 

13
Hunsu

In meinem Eclipse-Projekt in den Projekteinstellungen im Abschnitt "Java-Erstellungspfad" haben Bibliotheken zuvor eine interne JUnit-Bibliothek hinzugefügt, die JUnit Version 4.8 und Hamcrest-Core-Version 1.1 verwendet. Ich glaube, dass dies diesen Fehler in meinem Fall verursacht hat.

Ich lasse diese Information hier, vielleicht würde jemand anderes von meiner Erfahrung profitieren.

9
RockyMM

Verwenden Sie junit-dep.jar anstelle von junit.jar. Dies ist JUnit minus dessen Abhängigkeiten. Junit.jar enthält eine alte Version von Hamcrest.

6
Kkkev

Johan Mark (oben) schlug vor 

benennen Sie die Datei $Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar in etwas wie *.bak um oder entfernen Sie die Datei. "

Beim Umbenennen/Entfernen der Datei funktionierte meine Eclipse Junit-Bibliothek nicht mehr. Durch Ersetzen der JAR-Datei durch eine Kopie derselben Version aus meinem Maven-Repo wurde das Problem mit dem Zertifikat behoben.

(Wie jemand bei Google bemerkt hat, hat die Eclipse Junit-Kopie von hamcrest ein cert-Problem, die Maven-Kopie jedoch nicht ...)

4
Janneman

Stellen Sie zunächst sicher, dass Sie die JUnit-Abhängigkeit in der POM.xml-Datei hinzugefügt haben.

Klicken Sie nun mit der rechten Maustaste auf das Projekt, und wechseln Sie zu den Eigenschaften. Wählen Sie den Java-Erstellungspfad aus, und wählen Sie die Registerkarte Bibliotheken aus. 

In meinem Fall gab es Maven-Abhängigkeiten, JRE- und Junit4-Bibliotheken. Ich habe gerade die Junit-Bibliothek entfernt und es funktioniert für mich. Oder man kann die Bibliotheken auch neu ordnen, da aufgrund der Reihenfolge von Hamcrest und JUnit4 das Problem aufgetreten ist.

4
imbond

Ich bekam die gleiche Ausnahme. Wie von beachw08 empfohlen, erwähnte ich:

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

Einer der Beiträge sagte:

benennen Sie die Datei $ Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar in etwas wie * .bak um oder entfernen Sie die Datei.

Ich habe das gemacht und mein Problem gelöst.

2
John Mark

Wenn Sie ein Maven-Projekt verwenden, entfernen Sie einfach die Junit-Bibliothek aus dem Erstellungspfad und importieren Sie stattdessen Junit und Hamcrest getrennt über POM. 

2
Avinav K

Wenn Sie die folgende Ausnahme erhalten: "Java.lang.SecurityException: class" org.hamcrest.Matchers "stimmt die Unterzeichnerinformation nicht mit der Unterzeichnerinformation anderer Klassen in demselben Paket überein", stellen Sie sicher, dass sich die Hamcrest-JAR vor der Junit-Bibliothek in befindet der Build-Pfad Sie können die Reihenfolge in den Projekteigenschaften unter Java Build Path auf der Registerkarte Order and Export konfigurieren. Klicken Sie auf den Bildlink, um mehr Klarheit zu erhalten: http://i.stack.imgur.com/Y5R15. png

2
Vaibhav Gupta

Ich löste dieses Problem, indem ich die Junit4-Bibliothek aus dem Build-Pfad entfernte, dem Build-Pfad TestNG-Bibliothek hinzufügte und TestNG-Annotationen anstelle von Junit4-Annotationen in mein Java-Programm importierte.

1
Jlearner

Dieser hat mein Problem gelöst: 

Ersetzen Sie $ Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar durch Maven oder die hamcrest-core-xx.jar Ihres Projekts (offensichtlich umbenannt in Eclipse jar).

0
Chetan Gole

Ich habe folgendes gemacht:

Zuerst in der POM-Datei habe ich Hamcrest-Core aus der Junit-Abhängigkeit ausgeschlossen und stattdessen Hamcrest-All verwendet. Zweitens habe ich die Eclipse JUNIT vom Build-Pfad entfernt, da sie die Maven-Instanz überschreibt. Die Bestellung hatte keine Auswirkungen auf meine Gläser, da das schlechte Glas ausgeschlossen wurde.

0
user666

Wenn Sie versuchen, dieses Problem für Ihren jeweiligen Kontext zu lösen, denken Sie daran, dass die oben dargestellte Stapelverfolgung nur ein Symptom ist. Die Lösungen können für einige Menschen funktionieren, für andere jedoch nicht.

Zum Beispiel:

  • Wenn der Hamcrest-JAR vor dem JUnit-JAR in den Klassenpfad gestellt wird, funktioniert dies in Situationen, in denen die verwendete Version von JUnit (älter) Hamcrest-Klassen enthält
  • Die Überlagerung der intern von Eclipse verwendeten Version von Hamcrest mit einer "Stock" -Version, die umbenannt wurde, um der internen Version zu entsprechen, kann funktionieren, wenn kein anderes Eclipse-Plugin-Paket Manifestinformationen in der ursprünglichen internen JAR verwendet 

In meinem Fall wurde das oben genannte Symptom durch einen Hamcrest-JAR verursacht, der intern von Eclipse verwendet wurde. Als ich versuchte, ihn durch eine umbenannte 'stock'-Version zu ersetzen, wurde alles, was mit JUnit zu tun hatte, beim Starten von Eclipse nicht geladen. Nachdem ich zur ursprünglichen internen Version zurückgekehrt war, wurde die SecurityException zurückgegeben. Die Lösung, die für mich funktionierte, war das Löschen des Manifests im JAR mit 7-Zip. Dies hat den JAR effektiv "unsigniert" und jetzt funktioniert meine spezielle Konfiguration.

0
user6629913

ich hatte kürzlich dieses Problem mit Eclipse und Junit. 

Um das zu lösen, habe ich das gemacht:

1 - Laden Sie das neueste Hamcrest-All-Jar von hier herunter: https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/hamcrest/

2- Gehen Sie zum Eclipse-Installationsordner: Eclipse/plugin/und suchen Sie nach dem org.hamcrest ... -Jar

3- Erstellen Sie eine Sicherungskopie der Stufe 2 und ersetzen Sie sie durch die Stufe 1 (benennen Sie sie wie in Stufe 2 um).

4- Eclipse neu starten

Danach wurde mein Problem gelöst.

0
Ravi NAGALINGAM

in meiner Umgebung Mac OS + Eclipse habe ich festgestellt, dass org.hamcrest.core_1.3.0.v201303031735.jar in meiner JUnit 4,

so lösche ich es aus pfad ~/.p2/pool/plugins /, dann aktualisiere ich das projekt, es funktioniert.

0
jet.lau

Ich ging in die Build-Eigenschaften des Projekts ein und änderte JUNIT von Version 4 auf Version 3 und es funktioniert jetzt einwandfrei.

Interessanterweise habe ich immer noch Version 4 in meiner pom.xml, daher neige ich zu der Meinung, dass dies ein Eclipse-Problem ist (ich konnte meine Tests über das Terminal problemlos erstellen und ausführen).

0
jbunton10

Die JUNIT 4-Bibliothek wurde von der Registerkarte "Bibliotheken" in Eclipse entfernt -> Java Erstellungspfad und es hat funktioniert.

0
Yogesh Samant

Ich hatte genau das gleiche Problem. Ich habe ein neues Projekt erstellt und mein Problem gelöst. 

Ich hatte das gleiche Problem wie hier beschrieben. Ich glaube, das Problem liegt in der junit4-JAR-Datei. 

Wenn Sie unter Eclipse pom editor die junit4-Hierarchie betrachten, werden Sie feststellen, dass sie von hamcrest-core abhängt (d. H. Hamcrest-core wird standardmäßig beim Kompilieren eingezogen). In meinem Unit-Test-Code verwende ich die Hamcrest-Collection Matchers (org.hamcrest.collection). Diese sind nicht im Kernglas enthalten und ich habe eine Abhängigkeit von hamcrest-all im pom eingerichtet. Dadurch wird die Einbindung des Hamcrest-Kerns dupliziert, und Sie scheinen offen zu sein, dass Ihre Version nicht mit der Junit-Hamcrest-Kernabhängigkeit und somit der Sicherheitsausnahme übereinstimmt. Ich entfernte die Hamcrest-all-Abhängigkeit und ersetzte sie durch die Hamcrest-Bibliothek, und die Ausnahme verschwand.

Wenn Sie nur core hamcrest verwenden, sollten Sie keine eigene Abhängigkeit einrichten und sich auf die Version verlassen, auf die junit zugreift. Alternativ können Sie, wie in einem anderen Kommentar vorgeschlagen, junit-dep verwenden, um die junit-Abhängigkeit zu beseitigen, und dann hamcrest-all einschließen.

0
Richard B

Wenn Sie Maven verwenden:

Schritte:

  1. Fügen Sie die neueste Hamcrest-Abhängigkeit in POM hinzu https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all

  2. Neueste JUnit-Abhängigkeit von hier in POM hinzufügen https://mvnrepository.com/artifact/junit/junit

  3. Entfernen Sie alle JUnit-Bibliotheken aus dem Erstellungspfad.

Wie hier gezeigt

und hier

  1. Nachdem Sie alle oben genannten Schritte ausgeführt haben, aktualisieren Sie Ihr Projekt und führen Sie es aus.
0
PRITEN PATEL