[java] 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” 에서 내 답변을 참조하십시오 .


답변

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


답변

이 대답을 계속 하면 , 처음 호출 할 때와 두 번째 호출 할 때와 같이 메소드가 다른 값을 반환하도록하려면 값을 전달할 수 있다는 또 다른 차이점이 있습니다.

PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));

따라서 동일한 테스트 사례에서 메소드가 호출되면 false를 반환 한 다음 다시 false를 반환하고 마지막으로 true를 반환합니다.


답변

후자의 대안은 반환하는 모의 메소드에 사용됩니다. void .

예를 들어 여기를 살펴보십시오 :
mockito를 사용하여 void 메소드를 모의하는 방법


답변