Ответ 1
Вы можете использовать junit-dep.jar(а не junit.jar), который не включает типы hamcrest. Тогда ссылки hamcrest в jmock не будут сталкиваться.
Я пытаюсь пройти через мой самый первый учебник по JMOCK http://www.jmock.org/getting-started.html, и все прошло неплохо.
Проблема, с которой я столкнулся, ниже:
java.lang.SecurityException: class "org.hamcrest.TypeSafeMatcher" 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, чтобы это произошло?
Спасибо,
Sarah
Вы можете использовать junit-dep.jar(а не junit.jar), который не включает типы hamcrest. Тогда ссылки hamcrest в jmock не будут сталкиваться.
Заказ библиотек в конфигурации сборки 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 здесь, и проблема исчезнет.
<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>
Это произошло со мной из-за дублирования зависимостей JUnit от проекта. Один добавленный eclipse и один из зависимостей Maven (m2eclipse/m2e добавляет этот путь в classpath).
Итак, удалите добавленный eclipse для проекта, перейдя в Project > Properties > Build Path
См. ниже.
Я просто столкнулся с той же проблемой, которая пыталась запустить тесты в проекте, отличном от Eclipse, который я только что импортировал. Посмотрев на другие ответы здесь, я заметил, что в pom.xml указан JUnit 3.
Поэтому я просто изменил "JUNIT_CONTAINER/4" на "JUNIT_CONTAINER/3" в .classpath
... и все тесты были успешными.