Mockito-doReturn ()과 when ()의 차이점
현재 Mockito를 사용하여 컨트롤러 메소드를 테스트하려는 Spring MVC 응용 프로그램에서 서비스 계층 객체를 조롱하는 과정에 있습니다. 그러나 Mockito의 세부 사항을 읽었을 때 방법 doReturn(...).when(...)
이와 동일 하다는 것을 알았 습니다 when(...).thenReturn(...)
. 그래서, 내 질문은 사이의 미묘한 차이 것입니다 같은 일을 또는 두 가지 방법을 가지고있는 점은 무엇이다 doReturn(...).when(...)
와는 when(...).thenReturn(...)
?
도움을 주시면 감사하겠습니다.
스터 빙의 두 가지 구문은 거의 같습니다. 그러나 항상doReturn/when
스터 빙에 사용할 수 있습니다 . 하지만를 사용할 수없는 경우가 있습니다 when/thenReturn
. 보이드 방법 스터 빙은 그러한 방법 중 하나입니다. 다른 방법으로는 Mockito 스파이와 함께 사용하고 같은 방법을 두 번 이상 스터 빙하는 것이 있습니다.
한 가지는 when/thenReturn
당신을 제공 doReturn/when
하지 않는 유형 검사는 컴파일시에, 반환하고 있다는 값이다. 그러나 나는 이것이 거의 가치가 없다고 생각합니다. 유형이 잘못되면 테스트를 실행하는 즉시 알게 될 것입니다.
만 사용하는 것이 좋습니다 doReturn/when
. 두 가지 구문을 배우는 데는 아무런 의미가 없습니다.
Forming Mockito "grammars" 에서 내 답변을 참조하십시오 . 매우 밀접한 관련 질문에 대한 자세한 답변입니다.
@Spy
mock 대신으로 spied 객체 (로 주석 달기 ) 를 사용하는 경우 두 방법 모두 다르게 작동합니다 @Mock
.
when(...) thenReturn(...)
지정된 값이 리턴되기 직전에 실제 메소드 호출 을 작성합니다. 따라서 호출 된 메소드가 예외를 던지면 처리하거나 조롱해야합니다. 물론 여전히 결과를 얻습니다 (당신이 정의 한 것thenReturn(...)
)doReturn(...) when(...)
메소드를 전혀 호출하지 않습니다 .
예:
public class MyClass {
protected String methodToBeTested() {
return anotherMethodInClass();
}
protected String anotherMethodInClass() {
throw new NullPointerException();
}
}
테스트:
@Spy
private MyClass myClass;
// ...
// would work fine
doReturn("test").when(myClass).anotherMethodInClass();
// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");
Mockito javadoc은 Mockito.when (Object)를 사용할 수없는 드문 경우에 doReturn () doReturn()
대신에 왜 when()
doReturn () 을 사용 하는지 설명하는 것 같습니다 .
Mockito.when (Object)는 항상 유형 호출이 안전하고 더 읽기 쉬운 (특히 연속 호출을 스터 빙 할 때) 스터 빙에 권장됩니다.
doReturn ()이 유용한 드문 경우는 다음과 같습니다.
1. 스파이에서 실제 물체를 감시하고 실제 방법을 호출 할 때 부작용이 발생하는 경우
List list = new LinkedList(); List spy = spy(list);
// 불가능 : 실제 메소드가 호출되어 spy.get (0)이 IndexOutOfBoundsException을 던짐 (목록이 비어 있음)
when(spy.get(0)).thenReturn("foo");
// 스터 빙에는 doReturn ()을 사용해야합니다.
doReturn("foo").when(spy).get(0);
2. 이전 예외 스터 빙 무시 :
when(mock.foo()).thenThrow(new RuntimeException());
// 불가능 : 예외 스텁 foo () 메소드가 호출되어 RuntimeException이 발생합니다.
when(mock.foo()).thenReturn("bar");
// 스터 빙에는 doReturn ()을 사용해야합니다.
doReturn("bar").when(mock).foo();
위의 시나리오는 Mockito의 우아한 구문의 균형을 보여줍니다. 그러나 시나리오는 매우 드 that니다. 감시는 산발적이어야하며 예외 스터 빙을 무시하는 것은 매우 드 rare니다. 일반적으로 스터 빙을 오버 라이딩하는 것은 너무 많은 스터 빙을 나타내는 잠재적 코드 냄새입니다.
후자의 대안은 반환하는 모의 메소드에 사용됩니다 void
.
예를 들어 여기를 살펴보십시오 : mockito를 사용하여 void 메소드를 모의하는 방법
이 대답을 계속 하면 , 처음 호출 할 때, 두 번째 호출 할 때와 같이 메소드가 다른 값을 반환하도록하려면 값을 전달할 수 있다는 또 다른 차이점이 있습니다.
PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));
So it will return false when the method is called in same test case and then it will return false again and lastly true.
"mock" can simulate a object instead of create it;"spy" can create a actual object with actual parameters. When we do unit test,we often use them. But 'when(xxx).thenReturn(xxx)' used for mock and 'doReturn(xxx).when(xxx)' used for spy.
참고URL : https://stackoverflow.com/questions/20353846/mockito-difference-between-doreturn-and-when
'IT' 카테고리의 다른 글
문자열에서 모든 공백을 제거하는 방법 (0) | 2020.05.31 |
---|---|
git 저장소를 특정 커밋으로 전환하는 방법 (0) | 2020.05.31 |
WebService에 대한 jQuery 호출이 "전송 없음"오류를 반환 함 (0) | 2020.05.31 |
Django 1.7에서 django.core.exceptions.AppRegistryNotReady가 발생 함 : 모델이 아직로드되지 않았습니다 (0) | 2020.05.31 |
파이썬 날짜 시간을 읽을 수있는 형식 날짜가있는 문자열로 바꾸려면 어떻게합니까? (0) | 2020.05.31 |