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ả
Trả lời
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ự).
liên kết bị hỏng cho Objenesis – bakoyaro
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 –
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ó.
- 1. Mockito ném NullPointer khi tạo đối tượng giả
- 2. Làm thế nào để tạo ra một đối tượng giả HttpWebRequest và HttpWebResponse
- 3. Tại sao đối tượng giả Mockito của tôi sử dụng thực sự thực hiện
- 4. Có thể truy vấn đối số được truyền cho đối tượng giả lập Mockito không?
- 5. Mockito - Đặt một phương thức của đối tượng được trả về bằng phương thức đối tượng giả
- 6. Làm thế nào để giả lập đối tượng với hàm tạo có một lớp?
- 7. Làm thế nào để tạo một thể hiện đối tượng với RTTI trong Delphi 2010?
- 8. Làm thế nào để tạo ra một thể hiện của lớp vô danh lớp trừu tượng trong Kotlin?
- 9. Có cách nào để khớp với đối số theo tên của đối tượng giả Mockito trong Thông số không?
- 10. Làm thế nào để tạo ra postback giả với javascript?
- 11. Tạo một thể hiện đối tượng unconstructed
- 12. Làm cách nào để biết một đối tượng có phải là mô hình Mockito không?
- 13. Làm thế nào để tạo ra đối tượng tập tin từ đối tượng URL
- 14. Làm thế nào để thay thế một thể hiện trong __init __() bằng một đối tượng khác?
- 15. Làm thế nào để tạo ra một X509Certificate2 giả tối thiểu?
- 16. java - Làm thế nào để tạo ra một thể hiện của loại generic T
- 17. Làm thế nào để tạo ra đối tượng toàn cầu trong một thư viện C#
- 18. Làm thế nào để ngăn chặn một đối tượng được tạo ra trên heap?
- 19. Làm thế nào để tạo ra một đối tượng Null trong C#
- 20. Có thể tạo một đối tượng giả lập thực hiện nhiều giao diện với EasyMock không?
- 21. Làm thế nào để yêu cầu một đối tượng giả lập Mockito trả lại một thứ gì đó khác trong lần gọi tiếp theo?
- 22. Làm thế nào để tạo các đối tượng lớp động?
- 23. Tạo đối tượng giả bằng giao diện
- 24. Làm thế nào để giả lập một phương thức trả về khoảng trống ảnh hưởng đến một đối tượng
- 25. Làm thế nào để C# tạo một thể hiện của một lớp?
- 26. Làm thế nào tôi có thể tạo ra một HttpResponse giả rỗng
- 27. Làm thế nào để tiêm FactoryBean thay vì đối tượng nó tạo ra?
- 28. Làm thế nào tôi có thể khởi tạo một đối tượng chỉ biết tên của nó?
- 29. Làm thế nào để tạo ra một đối tượng (lớp) có thể xử lý được trong D?
- 30. Tạo một đối tượng DataTable với dữ liệu giả
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