2012-08-02 2 views
58

아래의 (단순화 된) 코드를 테스트하기 위해 Mockito를 사용하고 싶습니다. 나는 Mockito에게 처음 실패하는 방법을 알지 못한다. 그리고 두 번째로 성공한다. 첫 번째 호출이 실패하고 두 번째 호출이 성공합니다.

for(int i = 1; i < 3; i++) { 
    String ret = myMock.doTheCall(); 

    if("Success".equals(ret)) { 
    log.write("success"); 
    } else if (i < 3) { 
    log.write("failed, but I'll try again. attempt: " + i); 
    } else { 
    throw new FailedThreeTimesException(); 
    } 
} 

내가 할 수있는 설정에 성공 시험 :

Mockito.when(myMock).doTheCall().thenReturn("Success"); 

와 함께 실패 시험 :

Mockito.when(myMock).doTheCall().thenReturn("you failed"); 

그러나이 어떻게 테스트 할 수는 한 번 (또는 두 번) 실패하면 다음 성공하니, 괜찮 니? the docs에서

+0

어느 한이 같은 사용 Jmockito을 달성하는 방법을 설명 할 수는 – Bharat

답변

130

는 :

때때로 우리는 같은 메소드 호출에 대해 서로 다른 반환 값/제외 스텁해야합니다. 일반적인 사용 사례는 반복자를 조롱하는 것일 수 있습니다. Mockito의 원본 버전에는 간단한 조롱을 조장하는이 기능이 없었습니다. 예를 들어, 반복자 대신 Iterable 또는 단순히 콜렉션을 사용할 수 있습니다. 그것들은 자연스러운 스터 빙 방법을 제공합니다 (예 : 실제 콜렉션 사용). 드문 시나리오에서 연속 호출을 스텁 것은, 그래도 유용 할 수있다 :

when(mock.someMethod("some arg")) 
    .thenThrow(new RuntimeException()) 
    .thenReturn("foo"); 

//First call: throws runtime exception: 
mock.someMethod("some arg"); 

//Second call: prints "foo" 
System.out.println(mock.someMethod("some arg")); 
귀하의 경우 그래서

, 당신이 원하는 것 :

when(myMock.doTheCall()) 
    .thenReturn("You failed") 
    .thenReturn("Success"); 
+0

이봐, 그 덕분에 존 굉장합니다. – vikingsteve

+9

이것은 void 메쏘드를 다루고있는 나의 시나리오에서 올바른 방향으로 (고마워) 지적했다. 그 경우 대체 스타일을 사용해야한다. doThrow (new RuntimeException()). doNothing(). when (myMock) .doTheCall();' – haggisandchips

18

가장 짧은 방법은 당신이 원하는 것을 작성하는 것은

입니다
when(myMock.doTheCall()).thenReturn("Success", "you failed"); 

thenReturn에 mutiple 인수를 제공하면 마지막 인수 인 w를 제외하고 각 인수는 한 번만 사용됩니다 hich는 필요한만큼 여러 번 사용됩니다. 예를 들어,이 경우 4 번 전화를 걸면 "성공", "실패", "실패", "실패"가 표시됩니다.

6

이와 관련한 설명은 읽기가 어렵 기 때문에. 형식화 된 답변을 추가하겠습니다.

void 함수를 사용하여이 작업을 수행하려고하는 경우. 행동이없는 것보다 예외가 필요한 곳. 그런 다음 같은 것을 할 것 :

Mockito.doThrow(new Exception("MESSAGE")) 
      .doNothing() 
      .when(mockService).method(eq()); 
0

thisthis 대답에 추가하려면를, 당신은 또한 체인에 조롱 전화를 루프를 사용할 수 있습니다. 이것은 같은 것을 여러 번 조롱하거나 어떤 패턴으로 조롱 할 필요가있을 때 유용합니다. (A 억지 일이기는하지만)

예 :

import org.mockito.stubbing.Stubber; 

Stubber stubber = doThrow(new Exception("Exception!")); 
for (int i=0; i<10; i++) { 
    if (i%2 == 0) { 
     stubber.doNothing(); 
    } else { 
     stubber.doThrow(new Exception("Exception")); 
    } 
} 
stubber.when(myMockObject).someMethod(anyString()); 
관련 문제