hamcresttesting总是失败

我正在使用hamcrest 1.3来testing我的代码。 这只是一个死亡。 我试图testing它,以确保生成的数字是小于13.我有一个打印语句,打印什么数字生成。 产生的数字总是less于13,但是testing总是失败。 有什么我做错了吗?

这是我正在testing的代码。

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

这是我的testing代码。

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

编辑:这是失败堆栈跟踪。

 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) 

这是帮助我解决问题的网站。

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

hamcrest.jar需要在构buildpath中的Junit库之前。

我刚刚从我的项目configuration中删除了JUnit库。 我仍然可以运行testing,因为JUnit也包含在我的pom文件中。 所以解决scheme只是使用Maven的库。

使用junit-dep.jar而不是junit.jar-这是JUnit减去它的依赖关系。 Junit.jar包含Hamcrest的旧版本。

在我的Eclipse里面,在Java Build Path部分的Project settings中,我已经添加了内部的JUnit库,它使用了JUnit 4.8和Hamcrest-core 1.1。 我相信这在我的情况下造成了这个错误。

我在这里留下这些信息,也许别人会从我的经验中受益。

我得到了同样的例外。 像beachw08推荐的,我提到:

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

其中的一个post说:

将文件$ ECLIPSE_HOME \ plugins \ org.hamcrest.core_1.3.0.v201303031735.jar重命名为类似* .bak的文件或删除该文件。

我做到了这一点,它解决了我的问题。

我解决了这个问题,从构buildpath中删除Junit4库,并添加TestNG库到构buildpath和导入TestNG批注,而不是我的Java程序中的Junit4批注。

首先确保已经在POM.xml文件中添加了JUnit依赖项。

现在,右键单击项目并转到属性,selectJava构buildpath并selectLibraries选项卡。

在我的情况下,有Maven的依赖,JRE和Junit4库。 而我刚刚删除了Junit库,它适用于我。 或者也可以重新sorting库,因为build立Hamcrest和JUnit4的顺序问题正在发生。

Johan Mark(上图)build议

将文件$ECLIPSE_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar重命名为类似*.bak的文件或删除该文件。

重命名/删除文件导致我的Eclipse Junit库停止工作,但是用我的Maven回购库中相同版本的副本replaceJAR文件使证书问题消失。

(正如Google上的一位人士所说,Hamcrest的Eclipse Junit副本有一个证书问题,但是Maven副本没有…)

我遇到了同样的问题。 我相信问题归结于junit4 jar文件。

如果在eclipse pom编辑器下,你看看junit4 Hierarchy,你会发现它依赖于hamcrest-core(即,默认情况下,hamcrest-core会被编译)。 在我的unit testing代码中,我使用了Hamcrest集合Matchers(org.hamcrest.collection)。 这些不包括在核心jar中,我build立了对hamcrest的依赖 – 所有在pom中。 这样做会重复Hamcrest核心包含,看起来会让你打开与junit hamcrest-core依赖关系的版本不匹配,从而导致安全exception。 我删除了hamcrest所有的依赖项,并用hamcrest-libraryreplace掉了,例外情况消失了。

如果你只使用core hamcrest,那么你不应该build立你自己的依赖关系,并依赖于junit的版本。或者,如另一个评论中所build议的,使用junit-dep去除junit依赖关系,然后包含hamcrest-all。

如果你得到下面的exception“java.lang.SecurityException:class”org.hamcrest.Matchers“的签名者信息与相同包中的其他类的签名者信息不匹配”,请确保hamcrest jar在Junit库之前构buildpath。 您可以在订单和导出选项卡上的Java Build Path下的项目属性中configuration订单。 点击下面的图片链接更清晰: http : //i.stack.imgur.com/Y5R15.png

我最近有这个问题与日食和Junit。

为了解决这个问题,我这样做了:

1 – 从这里下载最新的hamcrest-jar: https ://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/hamcrest/

2-进入eclipse安装文件夹:eclipse / plugin /并findorg.hamcrest … jar

3-备份第2步的jar,将其replace为第1步的jar(重命名为jar步骤2)。

4-重启eclipse

之后,我的问题解决了。

当试图解决这个问题为你的特定情况下,请记住上面的堆栈跟踪仅仅是一个症状。 解决scheme可能适用于某些人,但不适用于其他人。

例如:

  • 将Hamcrest JAR放在类path中的JUnit JAR之前,在使用的JUnit版本(旧版本)包含Hamcrest类的情况下
  • 如果没有其他Eclipse插件包在原始内部JAR中使用清单信息,则将Eclipse内部使用的Hamcrest版本与已更名为与内部版本相匹配的“库存”版本重叠可能会起作用

在我的情况中,上面的症状是由Eclipse内部使用的Hamcrest JAR引起的,当我尝试用“库存”重命名版本replace它时,启动Eclipse时与JUnit相关的任何内容都无法加载。 在我恢复到原来的内部版本之后, SecurityException返回。 我的解决scheme是使用7-Zip删除JAR中的清单。 这实际上是“无符号”的JAR,现在我的特定configuration工作。

我的环境Mac OS +日食,我发现org.hamcrest.core_1.3.0.v201303031735.jar是在我的JUnit 4,所以我不能让它比junit.jar转发。

所以我从path〜/ .p2 / pool / plugins /删除它,然后刷新项目,它的工作原理。

这个解决了我的问题:

用Maven或你项目的lib的hamcrest-core-xx.jarreplace$ ECLIPSE_HOME \ plugins \ org.hamcrest.core_1.3.0.v201303031735.jar(显然把它重命名为和eclipse jar同名)

我进入项目的build设属性,并将JUNIT从版本4更改为版本3,现在工作正常。

有趣的是我仍然在我的pom.xml中有版本4,所以我倾向于认为这是一个日食问题(我能够通过terminal构build和运行我的testing)。

如果您正在使用Maven项目,只需从构buildpath中删除Junit库,然后分别通过POM导入Junit和Hamcrest。

  • 如何断言与Hamcrest什么是空的?
  • Hamcrest有多个正确的结果(有没有匹配器?)
  • 为什么这段代码不试图使用Hamcrest的hasItems进行编译?