Другой экземпляр NoSuchMethodError
для комбинации JUnit и Hamcrest.
Нарушение кода:
assertThat(dirReader.document(0).getFields(), hasItem(
new FeatureMatcher<IndexableField, String>(equalTo("Patisnummer"), "Field key", "Field key") {
@Override
protected String featureValueOf(IndexableField actual) {
return actual.name();
} } ));
Прокомментированные строки 152-157 в IndexerTest.java (commit ac72ce)
Вызывает NoSuchMethodError (см. http://db.tt/qkkkTE78 для полного вывода):
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.FeatureMatcher.matchesSafely(FeatureMatcher.java:43)
at org.hamcrest.TypeSafeDiagnosingMatcher.matches(TypeSafeDiagnosingMatcher.java:55)
at org.hamcrest.core.IsCollectionContaining.matchesSafely(IsCollectionContaining.java:25)
at org.hamcrest.core.IsCollectionContaining.matchesSafely(IsCollectionContaining.java:14)
at org.hamcrest.TypeSafeDiagnosingMatcher.matches(TypeSafeDiagnosingMatcher.java:55)
at org.junit.Assert.assertThat(Assert.java:770)
at org.junit.Assert.assertThat(Assert.java:736)
at indexer.IndexerTest.testIndexContainsField(IndexerTest.java:152)
Настройка:
- JUnit 4.11
- Hamcrest 1.3
- Использование плагина Maven surefire (версия 2.14), в котором используется JUnitCoreProvider
- Java 7 (OpenJDK)
- См. pom (commit ac72ce)
История:
A NoSuchMethodError
вызвано (скомпилированными) классами, которые вызывают не существующие методы. Конкретный случай describeMismatch
и комбинация JUnit + Hamcrest часто вызваны несовместимостью между классами Hamcrest, включенными в JUnit, и версиями этих классов в библиотеке Hamcrest.
Попытки решить проблему NoSuchMethodError:
-
В pom содержится явная зависимость от Hamcrest-библиотеки 1.3, Hamcrest-core 1.3 и JUnit 4.11 (в указанном порядке), как предложено Garrett Hall в ответить на Получение "NoSuchMethodError: org.hamcrest.Matcher.describeMismatch" при запуске теста в IntelliJ 10.5
-
Согласно документации JUnit, зависимость JNnit 4.11 Maven больше не включает скомпилированные классы Hamcrest, вместо этого она имеет зависимость от Hamcrest-core 1.3; поэтому
NoSuchMethodError
не должен появляться. -
Проверка дерева зависимостей с
mvn dependency:tree
, как это было предложено Dan в to junit и hamcrest объявление показывает явные зависимости от Hamcrest 1.3 и JUnit 4.11 и никаких других зависимостей от этих файлов (см. http://db.tt/C2OfTDJB для полного вывода). -
В другом тесте
NoSuchMethodError
было исключено использование:assertThat( "Zylab detector not available", d.getDetectors(), hasItem(Matchers.<Detector>instanceOf(ZylabMetadataXmlDetector.class)));
В строках 120-123 IndexerTest.java (commit ac72ce) вместо более очевидного:
assertThat( "Zylab detector not available", d.getDetectors(), hasItem(isA(ZylabMetadataDetector.class));
Я не уверен, что явный тип параметра
<Detector>
, используяinstanceOf
вместоisA
, явную ссылку на HamcrestMatchers
или комбинацию тех, которые избегаютNoSuchMethodException
; после возиться и пробовать разные вещи, с которыми он работал. -
Использование явных параметров типа не решило/не устранило ошибку.
-
Использование класса, полученного из
BaseMatcher
вместоFeatureMatcher
, не решило/не устранило ошибку.