2011-10-04 36 views
7

Tôi đã xem xét các câu hỏi tương tự trên bảng này, nhưng không ai trong số họ trả lời câu hỏi của tôi. Điều này nghe có vẻ kỳ lạ, nhưng nó có thể giả lập một cuộc gọi hàm tạo trên đối tượng bạn đang chế nhạo.EasyMock: Mock ra một cuộc gọi constructor trong java

Ví dụ:

class RealGuy { 

    .... 
    public void someMethod(Customer customer) { 
    Customer customer = new Customer(145); 
    } 
} 
class MyUnitTest() { 
    public Customer customerMock = createMock(Customer.class) 
    public void test1() { 
    //i can inject the mock object, but it's still calling the constuctor 
    realGuyobj.someMethod(customerMock); 
    //the constructor call for constructor makes database connections, and such. 
    } 
} 

Làm thế nào tôi có thể mong đợi một cuộc gọi constructor? Tôi có thể thay đổi lời gọi hàm tạo của khách hàng để sử dụng newInstance, nhưng tôi không chắc liệu điều đó có hữu ích hay không. Tôi không kiểm soát được phần thân của hàm tạo new Customer(145).

Điều này có khả thi không?

+0

Sẽ là một ý tưởng hay khi không tạo kết nối cơ sở dữ liệu trong một hàm tạo. Tiêm các kết nối vào lớp bằng cách sử dụng chúng. –

+0

Đồng ý. Nhưng tôi không 'có quyền kiểm soát đối với logic của nhà xây dựng khách hàng đó. – Setzer

Trả lời

11

Bạn không thể làm điều này với easymock, vì nó không hỗ trợ các nhà xây dựng mocking. Có một thư viện được gọi là powermock có thể làm điều đó và là thư viện nhại duy nhất, theo như tôi biết, có thể tạo ra các hàm tạo và các phương thức tĩnh trong Java.

1
import static org.powermock.api.easymock.PowerMock.expectNew; 

instance = new UsesNewToInstantiateClass(); 
expectNew(AnyOldClass.class).andReturn(anyClass); 
15

bạn có thể làm như vậy với EasyMock 3.0 trở lên.

Customer cust = createMockBuilder(Customer.class) 
    .withConstructor(int.class) 
    .withArgs(145) 
    .addMockedMethod("someMethod") 
    .createMock(); 
Các vấn đề liên quan