这将是一个简单的问题,但是我找不到它们之间的区别,如果我的类路径中包含了这两个库,那么应该使用哪一个?
ijnw1ujt1#
Hamcrest匹配器方法返回Matcher<T>,Mockito匹配器返回T。因此,例如:org.hamcrest.Matchers.any(Integer.class)返回org.hamcrest.Matcher<Integer>的示例,org.mockito.Matchers.any(Integer.class)返回Integer的示例。这意味着只有在签名中需要Matcher<?>对象时才能使用Hamcrest匹配器--通常是在assertThat调用中。在设置调用mock对象的方法的期望或验证时,可以使用Mockito匹配器。例如(为清楚起见,使用完全限定名称):
Matcher<T>
org.hamcrest.Matchers.any(Integer.class)
org.hamcrest.Matcher<Integer>
org.mockito.Matchers.any(Integer.class)
Integer
Matcher<?>
assertThat
@Test public void testGetDelegatedBarByIndex() { Foo mockFoo = mock(Foo.class); // inject our mock objectUnderTest.setFoo(mockFoo); Bar mockBar = mock(Bar.class); when(mockFoo.getBarByIndex(org.mockito.Matchers.any(Integer.class))). thenReturn(mockBar); Bar actualBar = objectUnderTest.getDelegatedBarByIndex(1); assertThat(actualBar, org.hamcrest.Matchers.any(Bar.class)); verify(mockFoo).getBarByIndex(org.mockito.Matchers.any(Integer.class)); }
如果你想在需要Mockito匹配器的上下文中使用Hamcrest匹配器,你可以使用org.mockito.Matchers.argThat(或Mockito 2中的org.mockito.hamcrest.MockitoHamcrest.argThat)。它将Hamcrest匹配器转换成Mockito匹配器。因此,假设你想匹配一个具有一定精度(但不太高)的双精度值。在这种情况下,你可以这样做:
org.mockito.Matchers.argThat
org.mockito.hamcrest.MockitoHamcrest.argThat
when(mockFoo.getBarByDouble(argThat(is(closeTo(1.0, 0.001))))). thenReturn(mockBar);
1条答案
按热度按时间ijnw1ujt1#
Hamcrest匹配器方法返回
Matcher<T>
,Mockito匹配器返回T。因此,例如:org.hamcrest.Matchers.any(Integer.class)
返回org.hamcrest.Matcher<Integer>
的示例,org.mockito.Matchers.any(Integer.class)
返回Integer
的示例。这意味着只有在签名中需要
Matcher<?>
对象时才能使用Hamcrest匹配器--通常是在assertThat
调用中。在设置调用mock对象的方法的期望或验证时,可以使用Mockito匹配器。例如(为清楚起见,使用完全限定名称):
如果你想在需要Mockito匹配器的上下文中使用Hamcrest匹配器,你可以使用
org.mockito.Matchers.argThat
(或Mockito 2中的org.mockito.hamcrest.MockitoHamcrest.argThat
)。它将Hamcrest匹配器转换成Mockito匹配器。因此,假设你想匹配一个具有一定精度(但不太高)的双精度值。在这种情况下,你可以这样做: