тесты подколенного сухожилия всегда проваливаются - PullRequest
43 голосов
/ 11 марта 2012

Я использую Hamcrest 1.3 для проверки моего кода. Это просто кубик. Я пытаюсь проверить это, чтобы убедиться, что сгенерированное число меньше 13. У меня был оператор print, в котором было напечатано, какое сгенерированное число было. Сгенерированное число всегда было меньше 13, но тест всегда не удался. Что-то я делаю не так?

Это код, который я тестирую.

import java.util.Random;

public class Die {
    private int numSides;
    Random rand;

    public Die(int numSides){
        this.numSides = numSides;
        rand = new Random(System.currentTimeMillis());
    }

    public int roll(){
        return rand.nextInt(numSides) + 1;
    }
}

А это мой тестовый код.

import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.Test;

public class DieTest {
    @Test
    public void testRoll() {
        Die x = new Die(12);    
        assertThat(x.roll(), is(lessThan(13)));
    }
}

Редактировать: Это трассировка стека сбоев.

java.lang.SecurityException: class "org.hamcrest.Matchers"'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 DieTest.testRoll(DieTest.java:12)
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.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
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)

Ответы [ 20 ]

72 голосов
/ 12 марта 2012

Это сайт, который помогает мне решить проблему.

http://code.google.com/p/hamcrest/issues/detail?id=128

Файл hamcrest.jar должен находиться перед библиотекой Junit в пути сборки.

15 голосов
/ 05 апреля 2015

Я только что удалил библиотеку JUnit из конфигурации своего проекта.Я все еще могу запустить тесты, так как JUnit также включен в мой файл pom.Так что решение просто использовать библиотеку от Maven.

12 голосов
/ 28 января 2013

В моем Eclipse в настройках проекта в разделе «Путь сборки Java», «Библиотеки» я ранее добавил внутреннюю библиотеку JUnit, которая использует версию 4.8 JUnit и версию 1.1 hamcrest-core. Я считаю, что это было причиной этой ошибки в моем случае.

Я оставляю здесь немного информации, возможно, кому-то другому будет полезен мой опыт.

6 голосов
/ 13 марта 2012

Используйте junit-dep.jar вместо junit.jar - это JUnit за вычетом его зависимостей.Junit.jar содержит старую версию Hamcrest.

5 голосов
/ 27 октября 2017

Йохан Марк (см. Выше) предложил

переименовать файл $ECLIPSE_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar во что-то вроде *.bak или удалить файл. "

Переименование / удалениеиз-за этого файла моя библиотека Eclipse Junit перестала работать, но замена JAR-файла на копию той же версии из моего репозитория Maven устранила проблему с сертификатом.

(Как заметил кто-то в Google, копия Eclipse JunitУ Hamcrest есть проблема с сертификатом, но у Maven нет ...)

5 голосов
/ 27 сентября 2017

Если вы используете проект Maven, просто удалите библиотеку Junit из пути сборки и вместо этого импортируйте Junit и Hamcrest отдельно через POM.

4 голосов
/ 28 января 2016

Прежде всего убедитесь, что вы добавили зависимость JUnit в файл POM.xml.

Теперь щелкните правой кнопкой мыши проект и перейдите в свойства, выберите путь сборки Java и выберите вкладку Библиотеки.

В моем случае были зависимости Maven, библиотеки JRE и Junit4. И я только что удалил библиотеку Junit, и она работает для меня. Или можно также переупорядочить библиотеки, так как из-за порядка сборки Hamcrest и JUnit4 возникла проблема.

3 голосов
/ 10 января 2015

Я получаю такое же исключение.Как рекомендовано beachw08, я ссылался на:

http://code.google.com/p/hamcrest/issues/detail?id=128

В одном из сообщений сказано:

переименовать файл $ ECLIPSE_HOME \ plugins \ org.hamcrest.core_1.3.0.v201303031735.jar что-то вроде * .bak или удалите файл.

Я сделал это, и это решило мою проблему.

2 голосов
/ 11 марта 2016

Если вы получаете следующее исключение «java.lang.SecurityException: class» org.hamcrest.Matchers »информация подписывающего не совпадает с информацией подписывающего других классов в том же пакете», убедитесь, что jar hamcrest находится передБиблиотека Junit в пути сборки.Вы можете настроить порядок в свойствах проекта в Java Build Path на вкладке Order and Export.нажмите на ссылку ниже для большей ясности: http://i.stack.imgur.com/Y5R15.png

1 голос
/ 09 декабря 2015

Я решил эту проблему, удалив библиотеку Junit4 из пути сборки и добавив библиотеку TestNG в путь сборки и импортировав аннотации TestNG вместо аннотаций Junit4 в моей java-программе.

...