2013-08-28 39 views
17

Tôi có một phương pháp được kiểm tra có chứa đoạn mã sau:Mockito: chế giễu một ArrayList sẽ được looped trong một vòng lặp for

private void buildChainCode(List<TracedPath> lines){ 
    for(TracedPath path : lines){ 
     /.../ 
    } 
} 

đơn vị mã kiểm tra của tôi trông như thế này:

public class ChainCodeUnitTest extends TestCase { 

    private @Mock List<TracedPath> listOfPaths; 
    private @Mock TracedPath tracedPath; 

    protected void setUp() throws Exception { 
     super.setUp(); 
     MockitoAnnotations.initMocks(this); 
    } 

    public void testGetCode() { 
     when(listOfPaths.get(anyInt())).thenReturn(tracedPath); 

     ChainCode cc = new ChainCode(); 
     cc.getCode(listOfPaths); 

     /.../ 
    } 
} 

Vấn đề là, trong khi chạy thử nghiệm, mã thử nghiệm không bao giờ đi vào vòng lặp for. Điều gì khi các điều kiện tôi nên chỉ định, để vòng lặp for sẽ được nhập? Hiện tại tôi đã chỉ định when(listOfPaths.get(anyInt())).thenReturn(tracedPath), nhưng tôi đoán nó không bao giờ được sử dụng.

Trả lời

47

Vấn đề của bạn là khi bạn sử dụng bộ sưu tập trong vòng lặp cho mỗi, phương thức iterator() của nó sẽ được gọi; và bạn đã không khoe phương pháp cụ thể đó.

Thay vì chế nhạo danh sách, tôi đặc biệt khuyên bạn chỉ cần chuyển danh sách thực, trong đó các thành phần chỉ được mô phỏng TracedPath của bạn, bao nhiêu lần tùy ý bạn. Một cái gì đó như

listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath); 
+0

Cảm ơn, đó là một ý tưởng tuyệt vời. Một lời giải thích tốt là tốt. :) –

+0

nếu bạn không biết các yếu tố sẽ được thêm vào danh sách thì sao? – BlueShark

+0

Bạn chọn các yếu tố, tùy thuộc vào những gì bạn đang cố gắng kiểm tra. –

4

Java for-each vòng lặp được sử dụng trong phương pháp buildChainCode của bạn không được gọi get(), như bạn đã tìm ra - nó bằng cách sử dụng phương pháp quy định tại iterator()Collection<E>, mà List<E> kéo dài.

I thực sự sẽ không đề xuất chế nhạo danh sách. Không có lợi thế cho nó, trừ khi bạn hoàn toàn phải kiểm tra xem danh sách đã được lặp đi lặp lại chưa, và thậm chí sau đó, tốt hơn là khẳng định hoặc xác minh kết quả hành vi của lớp của bạn với các đầu vào nhất định.

Vượt qua một số triển khai List<E> như LinkedList<E> với tracedPath trong đó.

+0

Cảm ơn bạn đã giải thích tốt. Tôi sẽ đánh dấu nó như một câu trả lời nhưng một câu trả lời tương tự đã được gửi chỉ 3 phút trước khi bạn trả lời. –

+0

Cảm ơn bạn đã bình luận của bạn. Tôi đã được gọi đi để sửa chữa một cái gì đó trước khi tôi có thể hoàn thành bài của tôi - c'est la vie :) David là một câu trả lời tốt. –