IT

첫 번째 호출은 실패하고 두 번째 호출은 성공하는 시뮬레이션

lottoking 2020. 8. 31. 08:07
반응형

첫 번째 호출은 실패하고 두 번째 호출은 성공하는 시뮬레이션


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");

그러나 한 번 (또는 두 번) 실패하면 성공하는지 어떻게 테스트 할 수 있습니까?


에서 워드 프로세서 :

동일한 메서드 호출에 대해 다른 반환 값이 필요합니다. 일반적인 사용 사례는 반복적으로 조롱하는 것입니다. 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");

원하는 것을 쓰는 가장 짧은 방법은

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

이와 thenReturn같이 여러 개의 인수를 제공하면 필요한만큼 여러 번 사용되는 마지막 인수를 제외하고 각 인수는 최대 한 번만 사용됩니다. 예를 들어,이 경우 네 번 전화를 걸면 "성공", "실패", "실패", "실패"가 표시됩니다.


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

예외를 발생시키는 무효 함수를 사용하여 동작을 수행하고 그 작업을 수행 할 때 다음과 같이 수행합니다.

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

에 추가하려면 대답, 당신은 또한 체인에 조롱 전화를 루프를 사용할 수 있습니다. 이것은 같은 것을 여러 번 조롱하거나 어떤 패턴으로 조롱해야 할 때 유용합니다.

예 (파 페치 된 것임에도 불구하고) :

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());

상황이 다르기 void때문에 첫 번째 호출에 대한 함수 를 모의 하고 두 번째 호출에서 정상적으로 실행하고 싶었습니다 .

이것은 나를 위해 작동합니다.

Mockito.doThrow(new RuntimeException("random runtime exception")).doCallRealMethod().when(object).method(Mockito.any());

참고 URL : https://stackoverflow.com/questions/11785498/simulate-first-call-fails-second-call-succeeds

반응형