Mockito 2在任何(Class)方法中都有变化

时间:2016-12-09 12:28:55

标签: java mockito

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

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

when(criteriaBuilder.greaterThanOrEqualTo(any(Expression.class),
     any(Comparable.class)))
    .thenReturn(predicate);

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

我是否需要使用其他方法让它再次起作用? 我让它与(Expression)any()合作,但这对我来说并不合适。

1 个答案:

答案 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”的想法。 0null是安全的默认值,因此Mockito会在将anygt(5)的概念存储在堆栈上的相应位置时返回它们。

NullPointerException可能来自您的代码,它接收null(存根调用的默认值),期望收到predicate