Mockito 2在any(Class)方法中的更改

Chr*_*örz 3 java mockito

我已经从1.9版更新到Mockito 2.1。

现在我的一些测试失败了。方法似乎有所变化any(Bla.class)。在此测试还不错之前:

when(criteriaBuilder.greaterThanOrEqualTo(any(Expression.class),
     any(Comparable.class)))
    .thenReturn(predicate);
Run Code Online (Sandbox Code Playgroud)

现在表达式any(Expression.class)为空。

我是否需要使用另一种方法使其再次正常工作?我可以使用它,(Expression)any()但对我来说似乎不对。

Jef*_*ica 6

删除不带参数的Expression.class和呼叫any

when(criteriaBuilder.greaterThanOrEqualTo(any(), any()))
    .thenReturn(predicate);
Run Code Online (Sandbox Code Playgroud)

从Mockito 2开始,any(T.class)更改了含义:在此之前,其含义是“任何引用,包括null,都必须转换为该类型T以避免在Java 7及更高版本中进行显式转换”,它改为读取“ class的任何实例T”:因此,any(Foo.class)将停止匹配null从1.x升级到2.x的过程中。

any()不带参数的含义仍然是“任何包含null的引用”,在1.x到2.x之间保持一致,因此调用(Expression) any()ArgumentMatchers.<Expression>any()可以恢复所需的行为。由于Java 8中改进了通用类型推断规则,因此您也可以调用any()Java并推断类型。

不要担心像表达式any返回null,顺便说一句:这就是如何匹配器的Mockito工作。一个单独的堆栈跟踪“如何匹配此参数”,而不是返回“特殊实例”或“特殊值”;这是必要的,因为Java的是强类型的足够,有没有办法中的编码想法“大于5” intgt(5)的回报。0null是安全的默认值,因此Mockito在将概念any或存储gt(5)在堆栈中的相应位置时返回它们。

NullPointerException可能来自您null希望在其接收代码的地方(存根调用的默认值)predicate