2010-08-16 2 views
30

여러 번 호출 할 수있는 조롱 된 객체의 메소드가 있습니다 (재귀 호출). 이 방법은 다음과 같이 정의된다 :조롱 된 메서드가 처음으로 호출 될 때만 예외를 throw하는 방법은 무엇입니까?

public void doCommit() { } 

나는이 규칙을 사용 실패를 이야기하기 위해서는 :

doThrow(new RuntimeException()).when(mMockedObject).doCommit(); 

하지만이 메서드는이 예외를이 호출 될 때마다 던질 수 있습니다. 예를 들어, 호출 된 첫 번째 및 세 번째 시간에만 던져 넣을 수 있도록 어떻게 만들 수 있습니까? 즉, 예를 들어, 예외를 throw하지 않고 반환하는 두 번째 및 네 번째 시간을 의미합니다. 나는 doCommit()의 저자가 아니며, 내가 변경할 수있는 소스 코드가 없다는 것을 주목하라. Stubbing Consecutive Calls doco 읽기

답변

49

나는 그것을 (과르에게서 몇몇 암시로) 알아 냈다. 연속 void 메서드 호출을 스텁하는 방법은 다음과 같습니다.

doThrow(new RuntimeException()).doNothing().doThrow(...).doNothing().when(mMockedObject).doCommit(); 

감사합니다.

+1

위대한, 나는 올바른 방향으로 당신을 가리켰습니다. –

+1

을'BDDMockito '로 설정하면 willThrow (new RuntimeException()). willNothing(). willThrow (...). willNothing(). given (mMockedObject) .doCommit();' – ArtB

17

,이 같은 그것을 할 수 있습니다 당신이 실제로 기본 메소드를 호출하지 않으려는 경우 대신 thenCallRealMethod 방법의 thenAnswer를 사용하고 빈 스텁 imlementation를 제공해야

when(mMockedObject.doCommit()) 
    .thenThrow(new RuntimeException()) 
    .thenCallRealMethod() 
    .thenThrow(new RuntimeException()) 
    .thenCallRealMethod(); 

.

+1

잘 될지 모르겠지만 (뭔가있을 수 있습니다.) 내가 이것을 쓸 때 : 언제 (mMockedUpdatingBatch.updateBatch()). thenThrow (new RuntimeException()); 이 컴파일 오류가 발생합니다. Mockito 유형의 (T)가 인수 (void)에 해당하지 않을 때의 메소드. 나는()가 조롱 된 메소드가 void가 아닌 것으로 기대한다고 생각한다. – fnCzar

+2

아마도 doThrow(). doCallRealMethod(). when (mMockedObject) .doCommit();'을 사용하여 가능하다면 다시 작성해야합니다. –

관련 문제