2013-06-13 1 views
1
문제는 간단하다

...Mockito로 중간 값을 캡쳐하는 방법은 무엇입니까?

// Class Under Test 
list.add(1); 
dependency.handleList(list); 
list.clear(); 
list.add(2); 
dependency.handleList(list); 

//Test Code 
verify(mockDepenency, times(2)).handleList(argumentCaptor.capture()); 
List<Collection<Integer>> list = argumentCaptor.getAllValues(); 
assertEquals(1, list.get(0).get(0)); // fails value is 2 

이유는 Mockito 인수를 캡처하는 방식과 관련이있을 것으로 보인다. 즉, 모든 인수를 참조로 캡처합니다. 이것은 this issue과 관련이있는 것으로 보입니다.

이상적으로는 캡처시 복제본/복제본을 지정할 수 있지만 그 방법은 없습니다. 제가 누락 된 대안이 있습니까? 당신이 테스트중인 클래스에 list를 제공하는 경우

+0

나는 당신이 링크 한 이슈가 당신의 예 (범죄가 아닌)보다 조금 이해하기 쉽다고 생각합니다. 예를 들어'dependency.handList' 호출 사이를 확인할 수는 없습니까? –

+0

@tieTYT : handleList가 내가 테스트하고있는 클래스 (따라서 클래스 사용자 테스트 주석)에서 호출되어서 실제로 테스트하려고하는 클래스에 mockito 또는 juint 호출이 없기 때문에 no입니다. –

답변

2

, 당신은 아마도 예를 들어, 또한 조롱과에 검증을 수행 할 수 있습니다 :

final List<Integer> list = spy(List.class); 

... act... 

final InOrder inOrder = inOrder(list, mockDependency); 

inOrder.verify(list).add(1); 
inOrder.verify(mockDependency).handleList(list); 
inOrder.verify(list).clear(); 
inOrder.verify(mockDependency).handleList(list); 
inOrder.verify(list).add(2); 

을하지만,이 방법은 떠받 얼마나 잘 모르겠어요 귀하의 실제 시험.

편집 : whaley의 의견을 기반으로 mock에서으로 변경되었습니다.

+0

개인적으로 List.class의 모의 대신에 실제 List 구현을 스파이 (spy)하여 add/clear를 쓰지 않고 서술하지 않고 정상적으로 사용할 수 있도록합니다. – whaley

+0

@whaley 좋은 지적! 나는 너와 완전히 동의한다. – Jonathan

+0

@Jonathan : 목록은 실제로 메소드 안에 내장되어 있지만, power mockito는'new' 호출을 가로 챌 수 있습니다. +1 나와 함께 아마 받아 들일거야하지만 다른 사람이 물리는 경우 보려면 조금 더 열어 질문을 떠날거야. –

관련 문제