hamcrest测试总是失败

bea*_*w08 43 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试代码.

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)));
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:这是故障堆栈跟踪.

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)
Run Code Online (Sandbox Code Playgroud)

bea*_*w08 74

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

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

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

  • 我正在使用Maven; 即使我在我的pom.xml中列出JUnit之前的hamcrest jar,Eclispe似乎仍然使用它的内部Junit/Hamcrest jar,所以我仍然得到这个'签名者信息不匹配'错误.在Eclipse之外运行'mvn test'运行没有错误.上面的链接没有提到Maven.有关使Eclipse JUnit运行器工作的提示或帮助吗? (9认同)
  • 重要的是要记住(首先不是很清楚)hamcrest(或jmock)必须在`Order and Export`选项卡中的junit之前,而不是`Libraries`. (6认同)
  • 我和 dbj(上面的线程)在同一条船上。我们的项目使用 Eclipse 和 Maven,由于上述原因,我一直无法解决这个问题。我花了几个小时寻找解决方案,但从未找到。然而,在我寻求更好的断言机制的过程中,我找到了 FEST-ASSERT。我认为它比 Hamcrest 好,所以我的问题现在已经解决了(虽然不是我最初想要的方式)。 (2认同)
  • 从懒惰的链接:"简单修复:用Maven hamcrest-core-1.3.jar替换$ ECLIPSE_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar(显然将其重命名为与eclipse jar同名)" (2认同)

Hun*_*nsu 15

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


Roc*_*yMM 12

在我的Eclipse里面的Java Build Path部分的Project settings中,我以前添加了内部JUnit库,它使用了JUnit版本4.8和hamcrest-core版本1.1.我认为这在我的案例中导致了这个错误.

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


Kkk*_*kev 6

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

  • 从junit 4.11开始,junit.jar不再包含hamcrest类.junit-dep.jar已弃用.https://github.com/junit-team/junit/wiki/Use-with-Maven (3认同)

小智 5

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


小智 5

约翰·马克(上方)建议

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

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

(正如Google上的某位评论所述,hamcrest的Eclipse Junit副本存在证书问题,但Maven副本没有...)