Tôi đã rất ngạc nhiên khi phát hiện ra rằng sau mã ví dụ đơn giản không làm việc cho tất cả các phiên bản Mockito> 1.8.5Mockito @InjectMocks không hoạt động cho các trường có cùng loại
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock(name = "b2")
private B b2;
@InjectMocks
private A a;
@Test
public void testInjection() throws Exception {
assertNotNull(a.b2); //fails
assertNull(a.b1); //also fails, because unexpectedly b2 mock gets injected here
}
static class A{
private B b1;
private B b2;
}
interface B{}
}
Trong javadocs (http://docs.mockito.googlecode.com/hg/latest/org/mockito/InjectMocks.html) có một quote:
Lưu ý 1: Nếu bạn có các lĩnh vực với cùng một loại (hoặc tương tự tẩy xoá), đó là tốt hơn để đặt tên cho tất cả @Mock lĩnh vực chú thích với các lĩnh vực phù hợp, khác Mockito có thể bị lẫn lộn và tiêm sẽ không xảy ra.
Liệu nó có nghĩa rằng nếu tôi có một số lĩnh vực với cùng một loại I không thể giả duy nhất của họ mà là cần xác định @Mock
cho ALL lĩnh vực với cùng loại? Có phải giới hạn được biết đến và có bất kỳ lý do nào tại sao nó chưa được khắc phục? Cần phải đơn giản để khớp với @Mock
theo tên trường, phải không?
Thực tế tiêm chắc chắn có thể được thực hiện thông minh hơn một chút cho các trường hợp hợp pháp như vậy, nhưng sự an toàn là bắt buộc. Tiêm sẽ xảy ra tự động, vì vậy Mockito nên cư xử khá miễn cưỡng để tránh làm những việc xấu.Ngoài ra nếu tiêm phức tạp thì đối tượng của bạn quá phức tạp hoặc phải theo một mẫu tạo khác (ví dụ như một nhà xây dựng Joshua Bloch) – Brice
Đây là vấn đề đã biết và mã trên của bạn là một công việc xung quanh khi các giao diện giả mạo cùng loại tồn tại trong hệ thống đang được kiểm tra. – alltej