我已经从1.9版中更新为Mockito 2.1。
现在我的一些测试失败了。any(Bla.class)
方法似乎有所改变。在此测试之前:
when(criteriaBuilder.greaterThanOrEqualTo(any(Expression.class),
any(Comparable.class)))
.thenReturn(predicate);
现在表达式 any(Expression.class)
为null。
我是否需要使用另一种方法使其再次起作用?我让它与(Expression)any()
一起工作,但这对我来说并不正确。
丢弃Expression.class
并无参数调用any
:
when(criteriaBuilder.greaterThanOrEqualTo(any(), any()))
.thenReturn(predicate);
从Mockito 2开始,any(T.class)
改变了含义:在此之前,它的意思是"包括Null在内的任何参考,将其铸造为T
类型,以避免在Java 7和以前的ParkliciT中",它更改为读取"类T
的任何实例"。:因此,any(Foo.class)
将在从1.x升级到2.x时停止匹配null
。
没有参数的any()
仍然表示"包括null在内的任何参考",在1.x至2.x之间保持一致,因此调用(Expression) any()
或ArgumentMatchers.<Expression>any()
可以恢复所需的行为。由于Java 8中有改进的通用类型推理规则,您也可以调用any()
并让Java推断该类型。
顺便说一句,不必担心诸如any
返回null
之类的表达式:这就是Mockito Matchers的工作方式。单独的堆栈跟踪"如何匹配此参数",而不是返回"特殊实例"或"特殊值";这是必要的,因为Java足够强大,以至于gt(5)
返回的int
中无法编码"大于5"的想法。0
和null
是安全的默认值,因此Mockito在将any
或gt(5)
的概念存储在堆栈上的相应位置中。
NullPoInterException可能来自接收null
的代码(固定呼叫的默认值),该代码期望接收predicate
。