【问题标题】:hamcrest tests always failhamcrest 测试总是失败
【发布时间】:2012-03-27 22:48:26
【问题描述】:

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

【问题讨论】:

  • 对我来说很好。请注意,这仅测试一次滚动,显然并没有太大帮助。 (稍微收回;如果我将值更改为8 并获得更高的投掷,我会收到一个 Hamcrest 错误,使用 1.3.0RC2。你使用的是什么版本?)
  • 顺便说一句,您的代码将以相等的概率生成从 1 到 12 的每个数字。但是如果你掷两个标准骰子,不同的数字会产生不同的概率(7 最有可能,2 和 12 最不可能,1 是不可能的)。因此,如果这就是您要建模的内容,则您的代码不准确。 :)
  • 你能发布错误的堆栈跟踪吗?
  • 我使用的是 1.3.0RC2。谢谢 MatrixFrog 我什至没有想到。
  • 你应该接受其中一个答案。

标签: java junit hamcrest


【解决方案1】:

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

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

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

【讨论】:

  • 重要的是要记住(起初不太清楚)hamcrest(或 jmock)必须在 Order and Export 选项卡中的 junit 之前,而不是 Libraries。
  • 我正在使用 Maven;即使我在我的 pom.xml 中列出了 JUnit 之前的 hamcrest jar,Eclispe 似乎仍然使用其内部的 Junit/Hamcrest jar,所以我仍然收到此“签名者信息不匹配”错误。在 Eclipse 之外运行“mvn test”运行没有错误。上面的链接没有提到 Maven。任何提示或帮助让 Eclipse JUnit runner 工作?
  • 我和 dbj 在同一条船上(上面的线程)。我们的项目使用 Eclipse 和 Maven,由于上述原因,我一直无法解决这个问题。我花了几个小时寻找解决方案,但从未找到。然而,在我寻求更好的断言机制时,我发现了 FEST-ASSERT。我认为它比 Hamcrest 更好,所以我的问题现在已经解决了(虽然不是按照我最初想要的方式)。
  • 这对我没有帮助。我正在使用rest-assured 3.0.3 并且导入eclipse JUnit 4 将导致上述错误。为了解决这个问题,我向我的pom.xml 添加了一个进一步的依赖项,即 JUnit (4.4) 本身,而不是 Run As - JUnit test 我现在以 Maven test 运行 - 效果很好。
  • 来自懒惰的链接:“简单修复:将 $ECLIPSE_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar 替换为 Maven hamcrest-core-1.3.jar(显然将其重命名为与eclipse jar同名)"
【解决方案2】:

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

【讨论】:

【解决方案3】:

在我的 Eclipse 内 Java 构建路径部分的项目设置中,我之前添加了使用 JUnit 4.8 版和 hamcrest-core 1.1 版的内部 JUnit 库。我相信这导致了我的这个错误。

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

【讨论】:

  • 这就是我的情况!谢谢。
  • 在 Eclipse 中使用 Maven 项目时容易犯的错误。
  • 是的,从我的构建路径中删除 Junit 4 可以解决这个问题。
【解决方案4】:

我遇到了与此处详述相同的问题。我相信问题归结为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-全部。

【讨论】:

    【解决方案5】:

    我遇到了同样的异常。像 beachw08 推荐的一样,我指的是:

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

    其中一个帖子说:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 这对我有帮助。由于某种原因,即使椭圆的 junit4 在 maven 库下,它也不起作用。
      • 这就是为我解决问题的原因。在项目构建路径中,我将 JUnit 作为单独的库和 Maven 依赖项下的 jar 拉入。删除库后,问题就消失了。
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

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

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

        【讨论】:

          【解决方案9】:

          如果遇到如下异常“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

          【讨论】:

            【解决方案10】:

            我最近遇到了 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

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

            【讨论】:

              【解决方案11】:

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

              例如:

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

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

              【讨论】:

                【解决方案12】:

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

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

                【讨论】:

                  【解决方案13】:

                  这个解决了我的问题:

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

                  【讨论】:

                    【解决方案14】:

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

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

                    【讨论】:

                      【解决方案15】:

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

                      【讨论】:

                      • 这对我有用。错误是因为我使用的 ArrayList 符号(java.util 之一)不匹配。
                      • 这对我也有用。它简单、简洁,不会与核心 JAR 混淆。
                      【解决方案16】:

                      约翰马克(上)建议

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

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

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

                      【讨论】:

                        【解决方案17】:

                        我做了以下事情:

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

                        【讨论】:

                          【解决方案18】:

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

                          【讨论】:

                            【解决方案19】:

                            如果您使用的是 Maven:

                            步骤:

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

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

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

                            As Shown here

                            and Here

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

                            【讨论】:

                            • 使用 hamcrest-all 而不是 hamcrest-library 是我的解决方案。
                            【解决方案20】:

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

                            【讨论】:

                              【解决方案21】:

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

                              【讨论】:

                              • 嘿,您的回答确实特定于正在使用的 IDE。更详细地解释您正在做的事情会很有用(例如,将依赖顺序更改为...),以便任何不使用与您相同的 IDE 的人仍然可以从您的答案中受益。 :)
                              【解决方案22】:

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

                              【讨论】:

                                猜你喜欢
                                • 2020-06-22
                                • 2017-06-11
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2012-10-23
                                • 1970-01-01
                                相关资源
                                最近更新 更多