断言,为null或是特定类的实例

时间:2012-11-30 11:31:23

标签: java unit-testing junit assertions hamcrest

我认为简单

 Assert.assertThat(
                iterator.next(),
                Matchers.either(Matchers.nullValue()).or(
                        Matchers.instanceOf(Double.class)));

所以我想要ensre next()返回两个中的一个,NULL或Double的实例。 好像

Assert.assertTrue(next == null || next instanceof Double);

在...中测试运行(assertThat)结果

 java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.core.CombinableMatcher.matchesSafely(CombinableMatcher.java:17)
at org.hamcrest.TypeSafeDiagnosingMatcher.matches(TypeSafeDiagnosingMatcher.java:55)
at org.junit.Assert.assertThat(Assert.java:772)
at org.junit.Assert.assertThat(Assert.java:738

为什么呢?以及如何解决?

修改

你是对的,与Mockito的Hamcrest lib发生冲突。我修好了。 没有错误,但断言失败了,看看:

 java.lang.AssertionError: 
 Expected: (null or an instance of java.lang.Double)
 got: null
at org.junit.Assert.assertThat(Assert.java:780)
at org.junit.Assert.assertThat(Assert.java:738)

预计Null,得到null并且测试失败。

2 个答案:

答案 0 :(得分:2)

NoSuchMethodError表示编译时和运行时环境之间存在差异的问题。典型的原因是您在运行时拥有不同版本的JAR。也许你有两个Hamcrest JAR,但其中一个优先。仔细检查编译时和运行时类路径。

答案 1 :(得分:2)

我建议您有多个与Hamcrest有冲突的依赖关系。检查构建路径/ maven依赖项。

如果您在java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch上执行搜索,您将获得完全相同问题的以下条目列表:

Did you search before posting this question?

第一个结果对我来说是正确的:

First search result