52

我正在使用 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)
4

22 回答 22

77

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

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

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

于 2012-03-11T23:05:55.413 回答
19

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

于 2015-04-05T09:04:12.963 回答
14

在 Java Build Path 部分的项目设置中的 Eclipse 中,我之前添加了内部 JUnit 库,该库使用 JUnit 4.8 版和 hamcrest-core 1.1 版。我相信这在我的情况下导致了这个错误。

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

于 2013-01-28T16:47:38.087 回答
11

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

于 2017-09-27T10:12:24.667 回答
6

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

于 2012-03-13T17:41:11.593 回答
4

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

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

就我而言,有 Maven 依赖项、JRE 和 Junit4 库。我刚刚删除了 Junit 库,它对我有用。或者,由于 Hamcrest 和 JUnit4 的构建顺序,问题正在发生,也可以重新排序库。

于 2016-01-28T15:38:28.303 回答
4

Johan Mark(上图)建议

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

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

(正如 Google 上的某个人所说,hamcrest 的 Eclipse Junit 副本存在证书问题,但 Maven 副本没有……)

于 2017-10-27T05:30:29.193 回答
3

如果您使用 Maven:

脚步:

  1. 从这里https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all将最新的 Hamcrest 依赖项添加到 POM

  2. 将最新的 JUnit 依赖项添加到 POM 中,从这里 https://mvnrepository.com/artifact/junit/junit

  3. 从构建路径中删除任何 JUnit 库。

如此处所示

和这里

  1. 完成上述所有步骤后,刷新您的项目并运行。
于 2019-06-15T21:39:50.283 回答
2

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

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

其中一个帖子说:

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

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

于 2015-01-09T21:26:10.010 回答
2

如果遇到如下异常“java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match the other classes in the same package",请确保hamcrest jar在Junit库之前构建路径。您可以在 Order and Export 选项卡的 Java Build Path 下的项目属性中配置顺序。单击下面的图片链接以获得更清晰的信息:http: //i.stack.imgur.com/Y5R15.png

于 2016-03-11T10:16:28.210 回答
2

从 Eclipse -> Java Build 路径上的库选项卡中删除了 JUNIT 4 库,它可以正常工作。

于 2019-07-05T15:13:44.627 回答
2

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

于 2020-04-13T15:50:10.123 回答
1

使用 Eclipse,我遇到了同样的问题,但mvn命令行工作正常。通过将 Junit 移除到构建路径不是. order and export上面的例子是在删除它之前。 在此处输入图像描述

于 2021-05-04T15:01:12.273 回答
1

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

于 2015-12-09T06:43:30.097 回答
0

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

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

如果您只使用核心 hamcrest,那么您不应该设置自己的依赖项并依赖 junit 引入的版本。或者,如另一条评论中所建议的,使用 junit-dep 去除 junit 依赖项,然后包含 hamcrest-all。

于 2014-11-27T22:57:24.780 回答
0

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

例如:

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

就我而言,上述症状是由内部使用并由 Eclipse 提供的 Hamcrest JAR 引起的,当我尝试用“库存”重命名版本替换它时,当我启动 Eclipse 时,任何与 JUnit 相关的内容都无法加载。在我恢复到原来的内部版本后,SecurityException返回了。对我有用的解决方案是使用 7-Zip 删除 JAR 中的清单。这有效地“未签名”JAR,现在我的特定配置有效。

于 2016-08-26T12:52:43.653 回答
0

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

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

于 2017-05-07T11:27:00.340 回答
0

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

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

于 2017-05-31T18:59:42.850 回答
0

我做了以下事情:

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

于 2017-12-19T14:21:20.197 回答
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(将其重命名为与第 2 步的 jar 相同)。

4-重启eclipse

之后,我的问题就解决了。

于 2016-04-01T09:13:10.270 回答
0

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

于 2018-05-08T07:40:19.493 回答
0

这个解决了我的问题:

将 $ECLIPSE_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar 替换为 Maven 或您项目的 lib 的 hamcrest-core-xx.jar(显然将其重命名为与 eclipse jar 相同的名称)

于 2017-05-08T11:27:29.437 回答