2011-12-01 3 views
26

Đó sẽ là một cách dễ dàng, nhưng tôi không thể tìm thấy sự khác biệt giữa chúng và cái nào để sử dụng, nếu tôi có cả lib được bao gồm trong classpath của tôi?Matcher của Mockito vs Hamcrest Matcher?

+0

liên quan: [? Làm thế nào để Mockito quẹt làm việc] (http://stackoverflow.com/a/22822514/1426891) –

Trả lời

71

phương pháp khớp hamcrest trở Matcher<T> và Mockito quẹt trở T. Vì vậy, ví dụ: org.hamcrest.Matchers.any(Integer.class) trả về một thể hiện của org.hamcrest.Matcher<Integer>, và org.mockito.Matchers.any(Integer.class) trả về một thể hiện của Integer.

Điều đó có nghĩa là bạn chỉ có thể sử dụng đối sánh Hamcrest khi một đối tượng Matcher<?> được mong đợi trong chữ ký - thông thường, trong các cuộc gọi assertThat. Khi thiết lập kỳ vọng hoặc xác minh nơi bạn đang gọi các phương thức của đối tượng giả, bạn sử dụng đối sánh Mockito.

Ví dụ (với tên đầy đủ cho rõ ràng):

@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)); 
} 

Nếu bạn muốn sử dụng một khớp hamcrest trong một bối cảnh mà đòi hỏi một khớp Mockito, bạn có thể sử dụng org.mockito.Matchers.argThat khớp. Nó chuyển đổi một trận đấu Hamcrest thành một trận đấu Mockito. Vì vậy, giả sử bạn muốn khớp một giá trị kép với độ chính xác (nhưng không nhiều). Trong trường hợp đó, bạn có thể làm:

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

Chỉ cần lưu ý rằng, trong Mockito 2, ' argThat' quá tải hoạt động với Hamcrest 'Matcher' đã được chuyển đi 'MockitoHamcrest'. [Có gì mới trong Mockito 2] (https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2#incompatible) thảo luận về điều này trong phần "Thay đổi không tương thích với 1.10" của nó. –