Получение «NoSuchMethodError: org.hamcrest.Matcher.describeMismatch» при запуске теста в IntelliJ 10.5

Я использую JUnit-dep 4.10 и Hamcrest 1.3.RC2.

Я создал пользовательский соединитель, который выглядит следующим образом:

public static class MyMatcher extends TypeSafeMatcher { @Override protected boolean matchesSafely(String s) { /* implementation */ } @Override public void describeTo(Description description) { /* implementation */ } @Override protected void describeMismatchSafely(String item, Description mismatchDescription) { /* implementation */ } } 

Он отлично работает при запуске из командной строки с использованием Ant. Но при запуске от IntelliJ он терпит неудачу:

 java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18) at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8) at com.netflix.build.MyTest.testmyStuff(MyTest.java:40) 

Я предполагаю, что он использует неправильный hamcrest.MatcherAssert. Как найти, какой hamcrest.MatcherAssert использует (т. Е. Какой файл jar используется для hamcrest.MatcherAssert)? AFAICT, единственные контейнеры для hamcrest в моем пути к classам – 1.3.RC2.

Является ли IntelliJ IDEA собственной копией JUnit или Hamcrest?

Как выполнить вывод CLASSPATH, который использует IntelliJ?

Удостоверьтесь, что баночка hamcrest выше в импортном порядке, чем в банке JUnit .

JUnit поставляется со своим собственным classом org.hamcrest.Matcher который, вероятно, используется вместо этого.

Вы также можете загрузить и использовать junit-dep-4.10.jar, а это JUnit без classов hamcrest.

mockito также имеет classы hamcrest в нем, поэтому вам может потребоваться переместить \ изменить порядок

Эта проблема также возникает, когда вы используете mockito-all на своем пути к classу, который уже устарел.

Если возможно, просто включите mockito-core .

Конфигурация Maven для смешивания junit, mockito и hamcrest:

   org.hamcrest hamcrest-core 1.3 test   org.hamcrest hamcrest-library 1.3 test   org.mockito mockito-all 1.9.5 test   junit junit 4.11 test   

Проблема заключалась в том, что использовался неправильный hamcrest.Matcher , а не hamcrest.MatcherAssert , class. Это было втянуто из зависимости junit-4.8, которую определяла одна из моих зависимостей.

Чтобы узнать, какие зависимости (и версии) включены из источника во время тестирования, выполните:

 mvn dependency:tree -Dscope=test 

Следующее должно быть самым правильным сегодня. Примечание. Junit 4.11 зависит от ядра hamcrest, поэтому вам не нужно указывать, что вообще, mockito-all нельзя использовать, поскольку он включает (не зависит от) hamcrest 1.1

  junit junit 4.11 test   org.mockito mockito-core 1.10.8 test   org.hamcrest hamcrest-core    

Это помогло мне после битвы немного

  org.hamcrest hamcrest-all 1.3 test   org.mockito mockito-all 1.9.5 test   junit junit 4.11 test  

Пытаться

expect(new ThrowableMessageMatcher(new StringContains(message)))

вместо

expectMessage(message)

Вы можете написать собственный ExpectedException или метод утилиты для завершения кода.

Я знаю, что это старый stream, но для решения этой проблемы я добавил следующее в мои файлы build.gradle. Как уже говорилось выше, проблема совместимости с mockito-all

Возможно, полезный пост :

 testCompile ('junit:junit:4.12') { exclude group: 'org.hamcrest' } testCompile ('org.mockito:mockito-core:1.10.19') { exclude group: 'org.hamcrest' } testCompile 'org.hamcrest:hamcrest-core:1.3' 

Несмотря на то, что это очень старый вопрос, и, вероятно, многие из рассмотренных идей решили многие проблемы, я все же хочу поделиться решением с сообществом, которое исправило мою проблему.

Я обнаружил, что проблема связана с функцией «hasItem», которую я использовал, чтобы проверить, содержит ли JSON-Array определенный элемент. В моем случае я проверил значение типа Long.

И это привело к проблеме.

Так или иначе, у Matches есть проблемы со значениями типа Long. (Я не использую JUnit или Rest-Assured так сильно, как idk. Именно поэтому, но я думаю, что возвращенные JSON-данные содержат только целые числа.)

Итак, что я сделал, чтобы исправить эту проблему, было следующее. Вместо того, чтобы использовать:

 long ID = ...; ... .then().assertThat() .body("myArray", hasItem(ID)); 

вам просто нужно отправить в Integer. Таким образом, рабочий код выглядел так:

 long ID = ...; ... .then().assertThat() .body("myArray", hasItem((int) ID)); 

Это, вероятно, не лучшее решение, но я просто хотел упомянуть, что исключение также может быть выбрано из-за неправильных / неизвестных типов данных.

Что работало для меня, было исключение группы hamcrest из компиляции теста junit.

Вот код из моего build.gradle:

 testCompile ('junit:junit:4.11') { exclude group: 'org.hamcrest' } 

Если вы используете IntelliJ, вам может понадобиться запустить gradle cleanIdea idea clean build чтобы снова определить зависимости.

Я знаю, что это не лучший ответ, но если вы не можете заставить работать class, это решение плана B.

В моем тестовом пути я добавил следующий интерфейс с реализацией по умолчанию для метода describeMismatch.

 package org.hamcrest; /** * PATCH because there's something wrong with the classpath. Hamcrest should be higher than Mockito so that the BaseMatcher * implements the describeMismatch method, but it doesn't work for me. */ public interface Matcher extends SelfDescribing { boolean matches(Object item); default void describeMismatch(Object item, Description mismatchDescription) { mismatchDescription.appendDescriptionOf(this).appendValue(item); } @Deprecated void _dont_implement_Matcher___instead_extend_BaseMatcher_(); } 
  • Как вы утверждаете, что определенное исключение выбрано в тестах JUnit 4?
  • различия между 2 classами JUnit Assert
  • Как запустить все тесты, принадлежащие определенной категории в JUnit 4
  • Изменение имен параметризованных тестов
  • Maven не находит тесты JUnit для запуска
  • Очистка после всех тестов junit
  • @RunWith (MockitoJUnitRunner.class) против MockitoAnnotations.initMocks (это)
  • Как запустить все тесты JUnit в категории / комплекте с Ant?
  • Давайте будем гением компьютера.