첫 번째 통화 실패 시뮬레이션, 두 번째 통화 성공
나는 아래의 (간단한) 코드를 테스트하기 위해 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
'programing' 카테고리의 다른 글
Vuex 스토어의 각 항목에 대해 점수를 할당(계산 기반)한 다음 점수별로 모두 정렬하십시오. (0) | 2022.05.13 |
---|---|
v-for: 어레이 요소 및 속성 소멸 (0) | 2022.05.12 |
Vue로 Vuex를 변이시키는 것이 좋은 습관인가?또한 관찰할 수 있는 대상을 설정하다. (0) | 2022.05.12 |
힙에 대한 메모리 할당이 스택에 비해 훨씬 느린 이유는? (0) | 2022.05.12 |
Vuejs - 슬롯 사용 시 하위 구성 요소의 vnode를 렌더링하는 방법 (0) | 2022.05.12 |