2011-01-21 77 views
11

我想通过我的第一个JMock的教程http://www.jmock.org/getting-started.html得到,而且它并不顺利。JMock的依赖问题

我遇到的问题是如下:

 

java.lang.SecurityException: class "org.hamcrest.TypeSafeMatcher"'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 java.lang.ClassLoader.defineClass1(Native Method) 
    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 org.jmock.internal.InvocationExpectationBuilder.createExpectationFrom(InvocationExpectationBuilder.java:86) 
    at org.jmock.internal.InvocationToExpectationTranslator.invoke(InvocationToExpectationTranslator.java:19) 
    at org.jmock.internal.FakeObjectMethods.invoke(FakeObjectMethods.java:38) 
    at org.jmock.lib.JavaReflectionImposteriser$1.invoke(JavaReflectionImposteriser.java:33) 
    at $Proxy8.receive(Unknown Source) 
    at PublisherTest$1.(PublisherTest.java:35) 
    at PublisherTest.oneSubscriberReceivesAMessage(PublisherTest.java:34) 
    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.internal.runners.TestMethod.invoke(TestMethod.java:66) 
    at org.jmock.integration.junit4.JMock$1.invoke(JMock.java:37) 
    at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:105) 
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94) 
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84) 
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) 
    at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:96) 
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:59) 
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:52) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) 
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:50) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) 
    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) 
 

我发现在互联网上的解决方案。请参阅下面:

解决方案是确保在每个插件依赖JUnit之前,对JMock JAR的任何依赖都会发生 。那样,Hamcrest从JMock加载的是 ,而不是从JUnit加载。

我的解决方案的理解是:让测试类使用hamcrest罐子从JMock的,而不是从Junit的一个?我对吗?我应该在Eclipse中做什么来实现它?

感谢,

萨拉

回答

2

你可以使用junit- DEP的.jar(而不是的junit.jar),这不包括hamcrest类型。然后jmock中的hamcrest引用不会发生冲突。

2
<dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit-dep</artifactId> 
     <version>4.8.2</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.hamcrest</groupId> 
       <artifactId>hamcrest-core</artifactId> 
      </exclusion> 
     </exclusions> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hamcrest</groupId> 
     <artifactId>hamcrest-all</artifactId> 
     <version>1.3.0RC2</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jmock</groupId> 
     <artifactId>jmock</artifactId> 
     <version>2.6.0-RC2</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.hamcrest</groupId> 
       <artifactId>hamcrest-core</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.hamcrest</groupId> 
       <artifactId>hamcrest-library</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.hamcrest</groupId> 
       <artifactId>hamcrest-unit-test</artifactId> 
      </exclusion> 
     </exclusions> 
     <scope>test</scope> 
    </dependency> 
    <!-- next libs are optional --> 
    <dependency> 
     <groupId>org.jmock</groupId> 
     <artifactId>jmock-junit3</artifactId> 
     <version>2.6.0-RC2</version> 
     <exclusions> 
      <exclusion> 
       <groupId>junit</groupId> 
       <artifactId>junit</artifactId> 
      </exclusion> 
     </exclusions> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jmock</groupId> 
     <artifactId>jmock-legacy</artifactId> 
     <version>2.6.0-RC2</version> 
     <scope>test</scope> 
    </dependency> 
+0

试图编辑这个,但我只需要改变几个字母,所以SO不会让我。确保你将1.3.0-RC2的Hamcrest版本更改为1.3,因为这是最新和最大的可用版本。 – mooreds 2013-01-16 19:57:48

8

文库在Eclipse顺序构建配置有:

hamcrest核-1.2.jar hamcrest库-1.2.jar JMock的-2.5.1.jar JRE [JavaSE的-1.6 ] JUnit_4.8.1.jar(蚀分布的一部分) hamcrest.core_1.1.0(使用JUnit 4.8.1捆扎)

的解决方案是简单的 - 确保hamcrest.jar是由包括了JUnit库之前Eclipse中的类路径。

,如果你看一下Java构建路径属性中的“排序和导出”选项卡(配置构建路径),我相信,你会发现,JUnit的罐子是hamcrest.jar以上。您可以在此处将JUNIT罐上方的Hamcrest移动,问题就会消失。

2

这发生在我身上,由于重复的项目的JUnit依赖。一个通过eclipse添加,一个来自Maven依赖项(m2eclipse/m2e也将这个添加到classpath中)。

所以通过Project>属性>构建路径

见下面取出一个用日食添加到项目。 enter image description here

0

我刚刚遇到了同样的问题,试图在我刚导入的非Eclipse项目中运行测试。在看了这里的其他答案之后,我注意到指定了JUnit 的pom.xml。

因此,我只是在.classpath中将“JUNIT_CONTAINER/4”更改为“JUNIT_CONTAINER/3”...并且所有测试都成功了。