我已从版本1.9更新到Mockito 2.1。
现在我的一些测试失败了。 any(Bla.class)
方法似乎有变化。在此测试之前没问题:
when(criteriaBuilder.greaterThanOrEqualTo(any(Expression.class),
any(Comparable.class)))
.thenReturn(predicate);
现在表达式any(Expression.class)
为空。
我是否需要使用其他方法让它再次起作用?
我让它与(Expression)any()
合作,但这对我来说并不合适。
答案 0 :(得分:5)
放弃Expression.class
并拨打any
不带参数:
when(criteriaBuilder.greaterThanOrEqualTo(any(), any()))
.thenReturn(predicate);
从Mockito 2开始,any(T.class)
改变了意义:在它之前的意思是“任何引用包括null,强制转换为类型T
以避免在Java 7和之前的版本中显式转换”,它改为阅读“类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
:那是how Mockito matchers work。一个单独的堆栈跟踪“如何匹配此参数”,而不是返回“特殊实例”或“特殊值”;这是必要的,因为Java的类型很强,因此无法在int
返回的gt(5)
内编码“大于5”的想法。 0
和null
是安全的默认值,因此Mockito会在将any
或gt(5)
的概念存储在堆栈上的相应位置时返回它们。
NullPointerException可能来自您的代码,它接收null
(存根调用的默认值),期望收到predicate
。