2011-01-21 27 views
11

Tôi đang cố gắng để có được thông qua hướng dẫn JMOCK đầu tiên của tôi http://www.jmock.org/getting-started.html, và nó đã không đi tốt.Vấn đề phụ thuộc JMOCK

Vấn đề tôi gặp phải là dưới đây:

 

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) 
 

Tôi đã tìm thấy một giải pháp trên internet. Vui lòng xem bên dưới:

Giải pháp là đảm bảo rằng mọi phụ thuộc trên JAR JMock xảy ra trước khi phụ thuộc vào JUnit trong mọi trình cắm. Bằng cách đó, Hamcrest là được tải từ JMock, không phải từ JUnit.

Sự hiểu biết của tôi về giải pháp là: làm cho lớp kiểm tra sử dụng bình hamcrest từ JMock thay vì bình từ Junit? Tôi có đúng không? Tôi nên làm gì trong Eclipse để làm cho nó xảy ra?

Cảm ơn,

Sarah

Trả lời

2

Bạn có thể sử dụng junit- dep .jar (chứ không phải junit.jar) mà không bao gồm các loại hamcrest. Sau đó, tài liệu tham khảo hamcrest trong jmock sẽ không đụng độ.

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

Đã cố gắng chỉnh sửa điều này, nhưng tôi chỉ cần thay đổi một vài chữ cái, vì vậy SO sẽ không cho phép tôi. Hãy chắc chắn rằng bạn thay đổi phiên bản hamcrest từ 1.3.0-RC2 thành 1.3, bởi vì đó là phiên bản mới nhất và lớn nhất có sẵn. – mooreds

8

Các thư viện đặt trong Eclipse xây dựng cấu hình là:

hamcrest-core-1.2.jar hamcrest-thư viện-1.2.jar JMock-2.5.1.jar JRE [JavaSE-1.6 ] JUnit_4.8.1.jar (một phần của sự phân bố thực) hamcrest.core_1.1.0 (kèm với JUnit 4.8.1)

giải pháp là đơn giản - chắc chắn rằng hamcrest.jar là trước thư viện JUnit bao gồm theo Eclipse trong classpath.

Tôi tin rằng nếu bạn nhìn vào tab "Đặt hàng và xuất" trong thuộc tính đường dẫn xây dựng java (Configure Build Path), bạn sẽ thấy rằng jar JUnit nằm phía trên hamcrest.jar. Bạn có thể di chuyển hamcrest trên bình JUnit ở đây và vấn đề sẽ biến mất.

2

Điều này xảy ra với tôi do phụ thuộc JUnit trùng lặp trong dự án. Một được thêm vào bởi eclipse và một từ Maven phụ thuộc (m2eclipse/m2e thêm cái này vào classpath nữa).

Vì vậy, hãy loại bỏ hình ảnh được thêm vào bằng nhật thực để chiếu bằng Dự án> Thuộc tính> Đường dẫn xây dựng

Xem bên dưới. enter image description here

0

Tôi vừa chạy vào cùng một vấn đề đang cố gắng chạy thử nghiệm trong dự án không phải Eclipse mà tôi vừa mới nhập. Sau khi xem xét các câu trả lời khác ở đây, tôi nhận thấy rằng tệp pom.xml được chỉ định JUnit .

Vì vậy, tôi chỉ cần thay đổi "JUNIT_CONTAINER/4" thành "JUNIT_CONTAINER/3" trong .classpath ... và tất cả các thử nghiệm đã thành công.

Các vấn đề liên quan