gpt4 book ai didi

maven - Hamcrest 1.3 和 JUnit 4.11 的 NoSuchMethodError

转载 作者:行者123 更新时间:2023-12-01 15:32:11 24 4
gpt4 key购买 nike

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();
} } ));

注释 IndexerTest.java 中的第 152-157 行(提交 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
  • 火腿 1.3
  • 使用 Maven 的 surefire 插件(版本 2.14),它使用其 JUnitCoreProvider
  • Java 7 (OpenJDK)
  • pom (提交 ac72ce)

  • 背景:

    NoSuchMethodError 是由调用不存在的方法的(编译的)类引起的。 describeMismatch的具体案例JUnit + Hamcrest 组合通常是由 JUnit 中包含的 Hamcrest 类与 Hamcrest 库中这些类的版本之间的不兼容引起的。

    尝试解决 NoSuchMethodError:
  • pom 包含对 Hamcrest-library 1.3、Hamcrest-core 1.3 和 JUnit 4.11 的显式依赖(按此顺序),如 Garrett Hall 所建议的在 answerGetting "NoSuchMethodError: org.hamcrest.Matcher.describeMismatch" when running test in IntelliJ 10.5
  • 根据 JUnit 文档,JUnit 4.11 Maven 依赖项不再包含已编译的 Hamcrest 类,而是依赖于 Hamcrest-core 1.3;所以NoSuchMethodError不应该发生。
  • 使用 mvn dependency:tree 检查依赖关系树正如 Dan 所建议的在 answerjunit and hamcrest declaration显示了对 Hamcrest 1.3 和 JUnit 4.11 的显式依赖关系,并且没有对这些文件的其他依赖关系(完整输出请参见 http://db.tt/C2OfTDJB)。
  • 在另一个测试中 NoSuchMethodError通过使用避免了:
    assertThat(
    "Zylab detector not available",
    d.getDetectors(),
    hasItem(Matchers.<Detector>instanceOf(ZylabMetadataXmlDetector.class)));

    IndexerTest.java 的第 120-123 行(提交 ac72ce)
    而不是更明显的:
    assertThat(
    "Zylab detector not available",
    d.getDetectors(),
    hasItem(isA(ZylabMetadataDetector.class));

    我不确定是否显式类型参数 <Detector> , 使用 instanceOf而不是 isA ,明确引用 Hamcrest 的 Matchers ,或那些避免了 NoSuchMethodException 的组合;在摆弄并尝试不同的事情之后,它起作用了。
  • 使用显式类型参数并不能解决/避免错误。
  • 使用派生自 BaseMatcher 的类而不是 FeatureMatcher没有解决/避免错误。

  • 想法如何修复 NoSuchMethodError ?

    最佳答案

    这个博客帮助我解决了同样的问题:

    https://tedvinke.wordpress.com/2013/12/17/mixing-junit-hamcrest-and-mockito-explaining-nosuchmethoderror/

    在 Mockito 和 Junit 的依赖项中,作者添加了排除:

    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <exclusions>
    <exclusion>
    <artifactId>hamcrest-core</artifactId>
    <groupId>org.hamcrest</groupId>
    </exclusion>
    </exclusions>
    </dependency>

    关于maven - Hamcrest 1.3 和 JUnit 4.11 的 NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15833015/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com