Java 莫基托';s Matcher vs Hamcrest Matcher?

Java 莫基托';s Matcher vs Hamcrest Matcher?,java,mockito,hamcrest,Java,Mockito,Hamcrest,这将是一个简单的问题,但是如果我的类路径中包含了两个库,我就找不到它们之间的区别,也找不到要使用哪一个 Hamcrest matcher方法返回matcher,Mockito matchers返回T。因此,例如:org.Hamcrest.matchers.any(Integer.class)返回org.Hamcrest.matcher的实例,而org.Mockito.matchers.any(Integer.class)返回Integer的实例 这意味着您只能在签名中需要Matcher对象时使用

这将是一个简单的问题,但是如果我的类路径中包含了两个库,我就找不到它们之间的区别,也找不到要使用哪一个

Hamcrest matcher方法返回
matcher
,Mockito matchers返回T。因此,例如:
org.Hamcrest.matchers.any(Integer.class)
返回
org.Hamcrest.matcher
的实例,而
org.Mockito.matchers.any(Integer.class)
返回
Integer
的实例

这意味着您只能在签名中需要
Matcher
对象时使用Hamcrest匹配器,通常是在
assertThat
调用中。在设置调用模拟对象方法的期望或验证时,使用Mockito匹配器

例如(为了清晰起见,使用完全限定的名称):

如果要在需要Mockito匹配器的上下文中使用Hamcrest匹配器,可以使用
org.Mockito.Matchers.argThat
matcher。它将Hamcrest匹配器转换为Mockito匹配器。所以,假设您希望以某种精度(但不太高)匹配一个双精度值。在这种情况下,您可以执行以下操作:

when(mockFoo.getBarByDouble(argThat(is(closeTo(1.0, 0.001))))).
    thenReturn(mockBar);

相关:只需注意,在Mockito 2中,与Hamcrest
Matcher
s一起工作的
argThat
重载被移动
MockitoHamcrest
。在“与1.10不兼容的更改”一节中讨论了这一点。
when(mockFoo.getBarByDouble(argThat(is(closeTo(1.0, 0.001))))).
    thenReturn(mockBar);