2013-08-21 79 views
5

Tôi có các lớp Java sau:phương pháp Nested chế giễu trong Mockito

public class A 
{ 
    @Autowired 
    private B b; 
    public int aFn() 
    { 
     int something = b.bFn(); 
    } 
} 
public class B 
{ 
    @Autowired 
    private C c; 
    public int bFn() 
    { 
     int something = c.cFn(); 
    } 
} 
public class C 
{ 
    public int cFn() 
    { 
     return 231; 
    } 
} 

Và thử nghiệm sau đây sử dụng Mockito để kiểm tra đoạn code trên:

public class test 
{ 
    @Autowired 
    private A a; 

    private C c; 

    @Test 
    public void testA() 
    { 
     c = mock(C.class); 
     when(c.cFn(),anyInt()).thenReturn(something); 
     assertEquals(0, a.aFn()); 
    } 
} 

Khi tôi gỡ lỗi Testa, tôi thấy rằng thực c.Cfn() được thực hiện, không được thực thi. Có điều gì tôi đang làm không chính xác ở đây không? Xin vui lòng giúp đỡ!

Trả lời

8

Trước hết, bạn nên luôn mô phỏng các phụ thuộc trực tiếp của một đối tượng chứ không phải phụ thuộc transitive của nó. Vì vậy, bạn nên thử B, và không C, để kiểm tra A. Sau đó, bạn sẽ viết một bài kiểm tra đơn vị cho B bằng cách chế nhạo C.

Thứ hai: bạn không tiêm bất cứ nơi nào trong thử nghiệm đơn vị. Những gì bạn cần có là:

public class Test { 

    // not autowired here 
    private A a; 

    private B mockB; 

    @Test 
    public void testA() { 
     mockB = mock(B.class); 
     when(b.bFn(), anyInt()).thenReturn(something); 

     // the missing part: injecting the mock into the tested object 
     a = new A(mockB); 
     // or a = new A(); 
     // a.setB(mockB); 

     assertEquals(0, a.aFn()); 
    } 
} 

Khi bạn sử dụng giả (B.class), bạn sẽ có được một trường hợp giả của B. Điều đó không có nghĩa là tất cả các trường hợp khác của B sẽ làm những gì giả làm.

Giả mạo C để kiểm tra A là một thực hành không tốt: kiểm tra đơn vị nên kiểm tra một lớp riêng biệt với các lớp khác. Nhưng nếu bạn thực sự muốn điều đó, sau đó tạo ra một giả lập C, tạo ra một B và tiêm C giả bên trong nó, sau đó tạo ra một A và tiêm B bên trong nó.

A --> B --> mockC 
+0

Tôi muốn khai c.cFn, chứ không phải b.bFn. Điều gì nên được thực hiện cho điều đó? – user1471283

+0

Đó là một thực tế không tốt. Bài kiểm tra đơn vị nên kiểm tra một lớp trong sự cô lập của những người khác. Nhưng nếu bạn muốn điều đó, sau đó tạo ra một giả lập C, tạo ra một B và tiêm C giả bên trong nó, sau đó tạo ra một A và tiêm B bên trong nó. 'A -> B -> mockC'. –

+0

Cảm ơn. Vui lòng sửa đổi câu trả lời của bạn theo đó. – user1471283