hamcrest测试总是失败

时间:2012-03-11 01:58:07

标签: java junit hamcrest

我正在使用hamcrest 1.3来测试我的代码。它只是一个骰子。我试图测试它以确保生成的数字小于13.我有一个打印语句打印生成的数字是什么。生成的数量始终小于13,但测试总是失败。有什么我做错了吗?

这是我正在测试的代码。

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

这是我的测试代码。

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)

21 个答案:

答案 0 :(得分:70)

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

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

hamcrest.jar需要在构建路径中的Junit库之前。

答案 1 :(得分:14)

我刚从项目配置中删除了JUnit库。我仍然可以运行测试,因为JUnit也包含在我的pom文件中。因此解决方案只使用Maven中的库。

答案 2 :(得分:11)

在Eclipse内部的Java Build Path部分的Project设置中,我以前添加了内部JUnit库,它使用JUnit版本4.8和hamcrest-core版本1.1。我相信这在我的案例中造成了这个错误。

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

答案 3 :(得分:6)

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

答案 4 :(得分:5)

Johan Mark(上图)建议

  

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

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

(正如谷歌上的某人所说,Hamcrest的Eclipse Junit副本有一个证书问题,但是Maven副本没有...)

答案 5 :(得分:4)

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

现在,右键单击项目并转到属性,选择Java构建路径并选择Libraries选项卡。

在我的例子中,有Maven依赖项,JRE和Junit4库。我刚刚删除了Junit库,它对我有用。或者也可以重新排序库,因为Hamcrest和JUnit4的构建顺序正在发生问题。

答案 6 :(得分:3)

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

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

其中一个帖子说:

  

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

我这样做了,它解决了我的问题。

答案 7 :(得分:3)

如果您使用的是Maven项目,只需从构建路径中删除Junit库,然后通过POM单独导入Junit和Hamcrest。

答案 8 :(得分:2)

如果你得到以下异常" java.lang.SecurityException:class" org.hamcrest.Matchers"的签名者信息与其他类的签名者信息不匹配package",确保hamcrest jar位于构建路径中的Junit库之前。您可以在“订购和导出”选项卡上的“Java构建路径”下的项目属性中配置订单。 点击下面的图片链接以获得更清晰: http://i.stack.imgur.com/Y5R15.png

答案 9 :(得分:1)

使用 Eclipse,我遇到了同样的问题,但使用 mvn 命令行可以正常工作。通过将 Junit 移除到构建路径,而不是order and export中的,解决了这个问题。上面的例子是在删除它之前。 enter image description here

答案 10 :(得分:1)

我有同样的问题。 右键单击项目/订购并导出/将hamcrest库上移至第一个位置,由于某种原因,它必须比您的Junit库先走

答案 11 :(得分:1)

我通过从构建路径中删除Junit4库并将TestNG库添加到构建路径并在我的java程序中导入TestNG注释而不是Junit4注释来解决了这个问题。

答案 12 :(得分:0)

我的环境Mac OS + eclipse,我发现org.hamcrest.core_1.3.0.v201303031735.jar在我的JUnit 4中, 所以我不能比junit.jar更好。

所以我从路径〜/ .p2 / pool / plugins /删除它,然后刷新项目,它可以工作。

答案 13 :(得分:0)

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

有趣的是,我的pom.xml中仍然有版本4,所以我倾向于认为这是一个日食问题(我能够通过终端构建并运行我的测试)。

答案 14 :(得分:0)

在尝试针对特定上下文解决此问题时,请记住上面的堆栈跟踪仅仅是一种症状。解决方案可能适用于某些人,但不适用于其他人。

例如:

  • 将Hamcrest JAR放在类路径中的JUnit JAR之前将适用于正在使用的JUnit版本(较旧)包含Hamcrest类的情况
  • 如果没有其他Eclipse插件包使用原始内部JAR中的清单信息,则覆盖Eclipse内部使用的Hamcrest版本,其中“stock”版本已重命名以匹配内部版本。

在我的情况下,上面的症状是由内部使用并由Eclipse提供的Hamcrest JAR引起的,当我尝试用'stock'重命名的版本替换它时,当我启动Eclipse时,与JUnit相关的任何内容都无法加载。在我恢复原始内部版本后,SecurityException返回。对我有用的解决方案是使用7-Zip删除JAR中的清单。这有效地'未签名'JAR,现在我的特定配置正常工作。

答案 15 :(得分:0)

我最近遇到了eclipse和Junit这个问题。

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

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

2-转到eclipse安装文件夹:eclipse / plugin /并找到org.hamcrest ... jar

3-备份第2步jar并将其替换为第1步jar(将其重命名为jar步骤2)。

4-重启eclipse

之后,我的问题解决了。

答案 16 :(得分:0)

我做了以下事情:

首先在pom文件中我从junit依赖中排除了hamcrest-core,而是使用了hamcrest-all。第二个我从构建路径中删除了eclipse JUNIT,因为它覆盖了maven。由于排除了坏罐,因此订购并没有影响我的罐子。

答案 17 :(得分:0)

我有完全相同的问题。我创建了一个新项目,它解决了我的问题。

答案 18 :(得分:0)

如果您正在使用Maven:

步骤:

  1. 从此处https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all

  2. 将最新的Hamcrest依赖关系添加到POM中
  3. 从此处将最新的JUnit依赖关系添加到POM中 https://mvnrepository.com/artifact/junit/junit

  4. 从构建路径中删除所有JUnit库。

As Shown here

and Here

  1. 完成上述所有步骤后,刷新项目并运行。

答案 19 :(得分:0)

从Eclipse-> Java Build path的“库”选项卡中删除了JUNIT 4库,并且可以使用。

答案 20 :(得分:0)

我遇到了与此处详述的问题相同的问题。我相信问题归结为junit4 jar文件。

如果在eclipse pom编辑器下,你看一下junit4 Hierarchy,你会发现它依赖于hamcrest-core(即默认情况下,hamcrest-core会在编译时被拉入)。在我的单元测试代码中,我使用了hamcrest集合Matchers(org.hamcrest.collection)。这些都没有包含在核心jar中,我在pom中建立了对hamcrest-all的依赖。这样做会复制hamcrest-core包含,并且似乎让你对junit hamcrest-core依赖的版本不匹配,从而导致安全异常。我删除了hamcrest-all依赖项并用hamcrest-library替换它,异常就消失了。

如果你只使用core hamcrest那么你就不应该设置自己的依赖关系并依赖于junit版本。或者,正如另一条评论所建议的那样,使用junit-dep去除junit依赖关系然后包括hamcrest-所有