2011-01-21 3 views
11

Я пытаюсь пройти мой самый первый учебник JMOCK http://www.jmock.org/getting-started.html, и все прошло не так хорошо.JMOCK Dependency Issue

Проблема я столкнулся ниже:

 

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) 
 

Я нашел решение в Интернете. Пожалуйста, см. Ниже:

Решение должно гарантировать, что любые зависимости от JAR JMock произойдут до зависимостей от JUnit в каждом подключаемом модуле. Таким образом, Hamcrest - , загруженный из JMock, а не из JUnit.

Мое понимание решения: заставить тестовый класс использовать банку hamcrest от JMock вместо того, чтобы один из Junit? Я прав? Что делать в Eclipse, чтобы это произошло?

Спасибо,

Сара

ответ

2

Вы можете использовать junit- отд .jar (а не junit.jar), который не включает в себя Hamcrest типов. Тогда ссылки hamcrest в jmock не будут сталкиваться.

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 не разрешил мне. Убедитесь, что вы изменили версию hamcrest с 1.3.0-RC2 до 1.3, потому что это самая последняя и самая доступная версия. – mooreds

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 (Configure Build Path), вы обнаружите, что JUnit jar находится выше hamcrest.jar. Вы можете переместить hamcrest выше JUnit jar здесь, и проблема исчезнет.

2

Это произошло со мной из-за дублирования зависимостей JUnit от проекта. Один добавленный eclipse и один из зависимостей Maven (m2eclipse/m2e добавляет этот путь в classpath, а также).

Так удалить один добавленный затмении проекта, перейдя в Project> Properties> Build Path

См. Ниже enter image description here

0

Я просто столкнулся с той же проблемой, пытаясь запустить тесты в проекте, отличном от Eclipse, который я только что импортировал. Посмотрев на другие ответы здесь, я заметил, что pom.xml указан JUnit .

Поэтому я просто изменил «JUNIT_CONTAINER/4» на «JUNIT_CONTAINER/3» в .classpath ... и все тесты прошли успешно.