현재 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니다. 일반적으로 스터 빙을 오버 라이딩하는 것은 너무 많은 스터 빙을 나타내는 잠재적 코드 냄새입니다.