2013-07-19 44 views
11

Làm thế nào tôi có thể thử với các lớp khác Mockito trong lớp học của tôi đang được kiểm tra?Lớp Mock trong lớp học dưới kiểm tra

Ví dụ:

MyClass.java

class MyClass { 
    public boolean performAnything() { 
     AnythingPerformerClass clazz = new AnythingPerformerClass(); 
     return clazz.doSomething();   
    } 
} 

AnythingPerformerClass.java

class AnythingPerformerClass { 
    public boolean doSomething() { 
     //very very complex logic 
     return result; 
    } 
} 

Và kiểm tra:

@Test 
public void testPerformAnything() throws Exception { 
    MyClass clazz = new MyClass(); 
    Assert.assertTrue(clazz.performAnything()); 
} 

Tôi có thể giả mạo AnythingPerformerClass f hoặc loại trừ logic không cần thiết từ AnythingPerformerClass? Tôi có thể ghi đè phương pháp doSomething() để trả lại đơn giản true hoặc false không?

Tại sao tôi chỉ định Mockito, vì tôi cần nó để thử nghiệm Android với Robolectric.

+0

Tại sao bạn khởi tạo một phiên bản của lớp cho mỗi cuộc gọi phương thức? Điều đó trông nghiêm túc quá mức cần thiết – fge

Trả lời

12

Bạn có thể cấu trúc lại MyClass để nó sử dụng dependency injection. Thay vì nó tạo ra một thể hiện AnythingPerformerClass bạn có thể vượt qua trong một thể hiện của lớp để các nhà xây dựng của MyClass như vậy:

class MyClass { 

    private final AnythingPerformerClass clazz; 

    MyClass(AnythingPerformerClass clazz) { 
     this.clazz = clazz; 
    } 

    public boolean performAnything() {   
    return clazz.doSomething();   
    } 
} 

Sau đó bạn có thể vượt qua trong việc thực hiện mô hình trong các thử nghiệm đơn vị

@Test 
public void testPerformAnything() throws Exception { 
    AnythingPerformerClass mockedPerformer = Mockito.mock(AnythingPerformerClass.class); 
    MyClass clazz = new MyClass(mockedPerformer); 
    ... 
} 

Hoặc, nếu AnythingPerformerClass chứa trạng thái của bạn thì bạn có thể chuyển một số AnythingPerformerClassBuilder cho hàm tạo.

+0

Theo [Tài liệu Mockito] (http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#2), giá trị trả về mặc định cho một 'boolean' nguyên thủy sẽ là 'false', vì vậy trường hợp kiểm tra này không thành công. – mthmulders

+0

Vâng, tôi bỏ qua bước mà cuộc gọi phương thức được chế nhạo. OP nói "Tôi có thể ghi đè phương thức doSomething() để trả về đơn giản đúng hay sai?" Vì vậy, tôi không nghĩ rằng tôi nên hạn chế mã. – cyon

1

Bạn có thể đặt những gì cần trả lại trong Mockito.

when(mock.method()).thenReturn(someValue) 
3

Vì nó hiện là (cả khai và instantiation của AnythingPerformerClass bên trong một phương pháp, nó không thể để chế nhạo các AnythingPerformerClass chỉ sử dụng Mockito.

Nếu có thể, di chuyển cả việc kê khai và instantiation của AnythingPerformerClass đến cấp độ lớp học: khai báo một biến mẫu của loại AnythingPerformerClass và được nó khởi tạo bởi hàm khởi tạo

Bằng cách đó, bạn có thể dễ dàng chèn một mô hình AnythingPerformerClass trong khi kiểm tra và xác định hành vi của nó. phong phú:

when(anythingPerformerClassMock.doSomething()).thenReturn(true); 

hoặc để kiểm tra xử lý lỗi:

when(anythingPerformerClassMock.doSomething()).thenTrow(new NullPointerException()); 
Các vấn đề liên quan