【问题标题】:Hamcrest bug with either-or and null or incorrect usage?具有非此即彼和空值或错误用法的 Hamcrest 错误?
【发布时间】:2015-09-24 10:59:01
【问题描述】:

当我遇到以下情况时,我感到很震惊:

assertThat(null, either(is(nullValue())).or(notNullValue()));

失败:

java.lang.AssertionError: 
Expected: (is null or not null)
     but: was null
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
    at org.junit.Assert.assertThat(Assert.java:956)
    at org.junit.Assert.assertThat(Assert.java:923)
    at Demo.testName(Demo.java:12)

我不认为这种用法很不寻常(我实际上是在尝试断言 null 或空映射)并且我找不到 Hamcrest 源代码有任何问题...

【问题讨论】:

    标签: java junit hamcrest


    【解决方案1】:

    使用anyOf

    来自Hamcrest tutorials

    anyOf - 如果任何匹配器匹配,则匹配,短路(如 Java ||)

    类似:

    assertThat(value, anyOf(equalTo(1), equalTo(2)));
    

    【讨论】:

      【解决方案2】:

      有时间做一些调试。

      问题是either() 生成一个扩展TypeSafeDiagnosingMatcherCombinableMatcher。后者自动拒绝null。

      恕我直言,Matcher 的类型参数实际上只是一个建议而不是要求,所以这个超类真的不安全......

      编辑:

      这是一个错误报告 (https://github.com/hamcrest/JavaHamcrest/issues/49)。我想它永远不会得到修复......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多