2011-01-21 66 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」...並且所有測試都成功了。