2014-11-13 3 views
2

This code from the documentation 것은 완전히 나를 이해할 수없는입니다 : 그것을 얻을Mockito 스파이가 스파이 활동을 할 때 어떻게 알 수 있습니까?

List list = new LinkedList(); 
List spy = spy(list); 

when(spy.size()).thenReturn(100); // <--- how does this spy know 
// not to call the real method???? 

//using the spy calls *real* methods 
spy.add("one"); 
spy.add("two"); 

를 Mockito는 자바에서 거의 여전히 이상하고있다. 혼란스러운 점은 spy.*when() 또는 무엇인가에 싸여 있는지 여부를 알기 전에 완전히 평가해야합니다. 어떻게 처음의 spy.* 메서드는 실제 객체를 호출하지 않지만 나중에 객체를 호출합니까?

+0

그것은 전에 답했습니다 HTTP를 참조하십시오 : // 유래. com/questions/11620103/mockito-spy-on-method-is-calling-the-original-method – nadirsaghar

+0

@nadirsaghar이 질문에 대한 답으로 연결 한 대답이 어떻게 표시되는지 모르겠 음 –

답변

1

정확한 구현을 모르지만 추측 할 수 있습니다.

먼저 spy(...)을 호출하면 지정된 객체가 프록시되고 위임 호출에 대한 참조로 유지됩니다.

when(spy.size()).thenReturn(100); 

size()은 처음 호출은 프록시 불려

Integer result = spy.size(); 
OngoingStubbing<Integer> stubbing = when(result); // result is useless 
stubbing.thenReturn(100); 

에 실질적으로 동등하다. 내부적으로는 호출을 등록 할 수 있습니다 (예 : static (글로벌) Mockito 스택). 그런 다음 when()을 호출하면 스택에서 Mockito가 튀어 나와서 size()에 대한 호출을 스터 빙이 필요함을 인식하고 필요한 모든 논리를 수행합니다.

이유는 stubbing in a multithreaded environment이 (는) 불량 사업 인 이유를 설명 할 수 있습니다.

+2

@DavidWallace ' 소스를 보게하려고합니다. –

+0

소스를보고 나 자신을 생각 나게하려고 생각했습니다.하지만 실제로는 아주 가깝습니다. 글로벌 스택이 없습니다. , 스텁 그 자체에 스터 빙 호가 등록되어 있지만 다른 모든 세부 사항은 옳습니다. 나는 너를 너무 급히 downvoted 생각, 그리고 지금 내 downvote을 제거합니다. –

+0

흠, 내 downvote를 제거하기 위해 중요하지 않은 편집을해야했습니다. 나는 때때로이 사이트가 싫다. –

2

문서 실제로 진짜 List.size() 메소드를 호출 처음 when(spy.size()).thenReturn(100)에 따르면, 참조 : 물론 http://mockito.github.io/mockito/docs/current/org/mockito/Mockito.html#13

각각의 후속 호출은 다음 조롱 결과를 반환합니다.

당신이 진짜 메소드를 호출하지 않으려면 (예를 들어 when(spy.get(0)).thenReturn(...) 아마 당신은이 패턴을 사용해야 IndexOutOfBoundsException를 슬로우 :. doReturn(...).when(spy).get(0);

+0

사실입니다. 그리고'doReturn (...). when ... (...) '이 필요할 때 걱정할 필요없이 항상'doReturn (...). when (...)'을 사용하는 옹호자입니다. 'when (...). then return (...)'을 사용하십시오. 사실, 나는이 사이트에서'When (...). thenReturn (...) '을 사용하지 말 것을 권장하는 Mockito 답을 올렸다. –

+0

@DavidWallace 스파이를 사용할 때 항상 doReturn()을 사용하거나 모의 함께 사용하는 경우 항상 사용하는 것이 좋습니다. 나는 항상 스파이와 함께 사용하는 경향이 있지만, 클래식 wen (...)을 찾으십시오. ... 더 읽기 쉽고 따라서 mock에 사용합니다. –

+1

내 선호는 mock과 함께 사용하는 것입니다.하나의 사례 만 다룰 때 두 가지 구문을 배우는 것이 중요하지 않습니다. 'when/thenReturn'이 작동하지 않는 모든 경우를 기억하는 것은 어렵습니다. @JBNizet –