2011-08-25 36 views
7

Có thể đặt mô hình như vậy sau khi sử dụng trong chu kỳ, ví dụ:Bộ giả lập mockito Java

for(String key: mySet) { ...} 

Cảm ơn.

+0

Erm ... Bạn đang nói gì vậy ?! – berry120

+0

Anh ta hỏi có cách nào để giả lập hành vi của một tập hợp trong vòng lặp for hay không. – Nicolas

Trả lời

10

Có một vài lựa chọn:

  1. Cast nó
  2. Sử dụng @Mock chú thích

Ví dụ:

Set<String> mySet = (Set<String>) mock(Set.class); 

--or--

@Mock 
private Set<String> mySet; 

@Before 
public void doBefore() throws Exception { 
    MockitoAnnotations.initMocks(this.getClass()); //this should create mocks for your objects... 
} 
5

Trong khi trong câu trả lời từ nicholas là hoàn toàn rõ ràng giải thích làm thế nào bạn giả lập một Set, tôi nghĩ rằng câu hỏi của bạn cũng ngụ ý rằng bạn muốn giả lập hành vi của các thiết lập trong vòng lặp.

Để đạt được điều đó trước hết bạn cần phải biết rằng mã của bạn là chỉ đường cú pháp và mở rộng để:

for (Iterator iterator = mySet.iterator(); iterator.hasNext();) { 
    String key = (String) iterator.next(); 
    ... 
} 

(Để biết chi tiết về điều đó xem câu hỏi Stackoverflow Which is more efficient, a for-each loop, or an iterator?)

Điều này làm cho rõ ràng rằng bạn cần phải thử phương pháp iterator(). Sau khi bạn thiết lập mô hình như được mô tả bởi nicholas, bạn giả lập phương thức lặp như sau:

when(mySet.iterator()).thenAnswer(new Answer<Iterator<String>>() { 
    @Override 
    public Iterator<String> answer(InvocationOnMock invocation) throws Throwable { 
     return Arrays.asList("A", "B").iterator(); 
    } 
}); 
Các vấn đề liên quan