2012-01-13 2 views
2

나는 문자열과 반복자를 수용하는 방법,이 :이 방법은 클래스를 조롱하려고Mockito : iterator가 같다고 기대하는 방법?

public int doSomething(String str, Iterator<String> itr) 

를, 그래서 전달 된 인수에 따라 정수 저를 반환합니다. 어떻게 Mockito의 when()을 호출하여 iterator가 내가 지정한 것과 동일한 "equal"이 될 것으로 기대합니까? 전달 된 반복자가 동적으로 시스템의 어딘가에을 구축 할 것입니다, 나는 when()에서의 동일한 인스턴스를 사용할 수 없습니다, 그래서 나는 단지 내 기대대로의 복사본을 만들 수 있습니다 : 나는 다음과 같은 시도

List<String> aList = new ArrayList<String>(); 
aList.add("one"); 
aList.add("two"); 

MyClass myMock = Mockito.mock(MyClass.class); 

, 그리고 없음

난 단지 anyObject() 사용하여 성공
Mockito.when(myMock.doSomething("some string", aList.iterator())).thenReturn(10); 
Mockito.when(myMock.doSomething(Matchers.eq("some string"), Matchers.eq(aList.iterator()))).thenReturn(10); 

: 다음 물론 나는 다른 결과를 설정할 수 없습니다

Mockito.when(myMock.doSomething(Matchers.eq("some string"), Matchers.anyObject())).thenReturn(10); 

을하지만, 출발을 그들에게 작동하는 것 같다 반복자에있는 내용으로 끝나는 ...

+0

당신이 작업 할 수 원하는 샘플 코드를 제공 할 수 있습니다. – kan

답변

1

당신은 (aListIsIteratorOfList 주어진 iterator'selements 모든 새 목록에 추가 될 때,이 새로운 목록은 생성자에 전달 된 목록 같은지 확인 ArgumentMatcher의 서브 클래스입니다

when(myMock.doSomething(eq("some string"), argThat(new IsIteratorOfList(aList)))) 

를 사용할 수 있습니다 이 경우).

정규식은 더 간단 할 수 있으며 첫 번째 요소 나 요소 수 또는 원하는 것을 확인하십시오.

+0

이 잘 작동하지만 모의 경우에만 하나의 정규식 (이 불행히도 내 질문에 언급하지 않았다 경우)에 대한 경우에만 : 두 개 이상의 matchers 있고, 예를 들어, 첫 번째 matcher를 통해 테스트중인 iterator 실행 그것이 일치하지 않는다는 것을 알았습니다 - 더 이상 일치하는 사람은 이미 "반복 된"반복자를받을 것이므로 다시 테스트 할 수 없으며 이는 틀릴 것입니다 ... – Laimoncijus

+0

예. 참으로. 코드를 리팩터링하고 컬렉션을 Iterator가 아닌 인수로 가져 오는 것을 고려하십시오. –

+0

안녕하세요. 가독성을 높이기 위해 코드를'when (myMock.doSomething (eq ("some string"), isIteratorOf (aList)))')로 작성하고 테스트 어딘가에 있거나 DIY 테스트 유틸리티 클래스에서' Iterator isIteratorOf (List list) {return argThat (새로운 IsIteratorOfList (리스트)); }'. 게다가 당신이 반복자를 소비 할 필요가 없다면 @JBNizet에 동의한다. 대신에 반복자를 받아들이 기 위해서는 반드시 refactor를 고려해야한다. – Brice

0

사용자는 항상 Iterator 인터페이스를 구현할 수 있습니다.