2010-06-29 39 views
7

Khi tôi tạo một đối tượng giả của lớp nhân viên nói. Nó không gọi hàm tạo của đối tượng Employee. Tôi biết nội bộ Mockito sử dụng CGLIb và phản chiếu, tạo ra một lớp proxy mở rộng lớp để giả lập. Nếu nó không gọi constructor của nhân viên làm thế nào là trường hợp giả của lớp nhân viên được tạo ra?Làm thế nào để mockito tạo ra một thể hiện của đối tượng giả

+1

Tôi nghĩ rằng đặt cược tốt nhất của bạn là xem mã souce. Theo sự hiểu biết của tôi, có vẻ như việc tạo lớp giả diễn ra trong phương thức "imposterise" trong lớp ClassImposterizer. Đây là liên kết đến lớp được đề cập ở trên: http://mockito.googlecode.com/svn/trunk/src/org/mockito/internal/creation/jmock/ClassImposterizer.java – sateesh

Trả lời

6

Mockito sử dụng CGLib để tạo đối tượng lớp. Tuy nhiên để khởi tạo đối tượng lớp này, nó sử dụng Objenesis http://objenesis.org/tutorial.html

Objenesis có thể khởi tạo đối tượng mà không có hàm tạo bằng cách sử dụng các kỹ thuật khác nhau (ví dụ: gọi ObjectStream.readObject và tương tự).

+0

liên kết bị hỏng cho Objenesis – bakoyaro

+2

Dường như chúng chuyển sang miền mới và dự án bây giờ là trên github. Tôi đã sửa liên kết –

1

Mockito đang sử dụng sự phản chiếu và CGLib để mở rộng lớp Nhân viên với một lớp cha được tạo động. Là một phần của điều này, nó bắt đầu bằng cách làm cho tất cả các nhà xây dựng của nhân viên công khai - bao gồm cả hàm dựng mặc định, vẫn còn xung quanh nhưng riêng tư nếu bạn khai báo một hàm tạo có tham số.

public <T> T imposterise(final MethodInterceptor interceptor, Class<T> mockedType, Class<?>... ancillaryTypes) { 
    try { 
     setConstructorsAccessible(mockedType, true); 
     Class<?> proxyClass = createProxyClass(mockedType, ancillaryTypes); 
     return mockedType.cast(createProxy(proxyClass, interceptor)); 
    } finally { 
     setConstructorsAccessible(mockedType, false); 
    } 
} 

private void setConstructorsAccessible(Class<?> mockedType, boolean accessible) { 
    for (Constructor<?> constructor : mockedType.getDeclaredConstructors()) { 
     constructor.setAccessible(accessible); 
    } 
} 

Tôi giả định rằng nó gọi hàm tạo mặc định khi siêu lớp được tạo, mặc dù tôi chưa thử nghiệm điều đó. Bạn có thể tự kiểm tra nó bằng cách khai báo hàm dựng riêng mặc định Employee() và đặt một số đăng nhập vào nó.

+0

Nó không bao giờ gọi hàm tạo mặc định bất cứ lúc nào. – Cshah

+0

Cảm ơn bạn, tôi đã tò mò về điều đó. – Lunivore

+0

Mockito gọi hàm tạo của lớp được tạo ra (có lẽ là để tránh tác dụng phụ khi gọi hàm tạo của kiểu đích) – iwein

Các vấn đề liên quan