programing

첫 번째 통화 실패 시뮬레이션, 두 번째 통화 성공

prostudy 2022. 5. 12. 21:59
반응형

첫 번째 통화 실패 시뮬레이션, 두 번째 통화 성공

나는 아래의 (간단한) 코드를 테스트하기 위해 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");

그러나 한 번 (혹은 두 번) 실패했다가 성공한다면 괜찮다는 것을 어떻게 시험해 볼 수 있을까?

문서에서:

때때로 동일한 메서드 호출에 대해 서로 다른 반환 값/예외 값을 스텁할 필요가 있다.일반적인 사용 사례는 반복자를 조롱하는 것일 수 있다.모키토의 원작에는 단순한 조롱을 조장하는 이 기능이 없었다.예를 들어 반복기 대신 반복기 대신 반복기 또는 단순 수집기를 사용할 수 있다.그것들은 자연적인 스터빙 방법을 제공한다(예: 실제 컬렉션을 사용한다.드문 시나리오에서는 연속 통화를 스텁(stub)하는 것이 유용할 수 있지만, 다음과 같다.

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이와 같이, 각 논거는 필요에 따라 여러 번 사용되는 바로 마지막 논거를 제외하고, 최대 한 번에 사용될 것이다.예를 들어, 이 경우, 전화를 4번 걸면, 「성공」 「실패」 「실패」 「실패」 「실패」가 된다.

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

만약 당신이 이 일을 하려고 하면.void예외를 발생시킨 다음 행동하지 않는 단계를 거쳐 다음과 같은 작업을 수행하는 기능:

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

나는 다른 상황이 있다, 나는 조롱하고 싶었다.void첫 번째 통화에 대해 기능을 수행하고 두 번째 통화에 정상적으로 실행하십시오.

이것은 나에게 효과가 있다:

Mockito.doThrow(new RuntimeException("random runtime exception"))
       .doCallRealMethod()
       .when(spy).someMethod(Mockito.any());

이것과 이 대답을 더하기 위해, 당신은 또한 루프를 사용하여 모의 통화를 연결시킬 수 있다.이것은 같은 것을 여러 번 조롱해야 하거나 어떤 패턴으로 조롱해야 할 경우에 유용하다.

예(비록 억지스러운 경우):

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

가장 짧은 것은

doReturn("Fail", "Success").when(myMock).doTheCall();

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

반응형