문제

현재 컨트롤러 메소드를 테스트하려는 스프링 MVC 응용 프로그램에서 Mockito를 사용하여 서비스 계층 객체를 조롱하는 과정에 있습니다. 그러나 Mockito의 세부 사항에 대해 읽었을 때, 나는 방법이 doReturn(...).when(...) 동일합니다 when(...).thenReturn(...). 따라서 내 질문은 같은 일을하는 두 가지 방법 또는 미묘한 차이점이 무엇인지에 대한 점은 무엇입니까? doReturn(...).when(...) 그리고 when(...).thenReturn(...)?

모든 도움이 감사하겠습니다.

도움이 되었습니까?

해결책

스터브를위한 두 개의 구문은 거의 동일합니다. 그러나 할 수 있습니다 언제나 사용 doReturn/when 스터브를 위해; 그러나 당신이 어디에 있는지 사례가 있습니다 캔트 사용 when/thenReturn. void 방법을 스튜빙하는 것은 그 중 하나입니다. 다른 사람들은 Mockito Spies와 함께 사용하고 동일한 방법을 두 번 이상 스터브하는 것입니다.

한 가지 when/thenReturn 당신에게 그것을 준다 doReturn/when 컴파일 타임에 반환하는 값의 유형 확인입니다. 그러나 나는 이것이 거의 가치가 없다고 생각합니다. 유형이 잘못되면 테스트를 실행하자마자 알게 될 것입니다.

사용 만 강력히 권장합니다 doReturn/when. 두 개의 구문을 배우는 데는 아무런 의미가 없습니다.

내 대답을 언급하고 싶을 수도 있습니다 모키토 "문법"형성 - 매우 밀접하게 관련된 질문에 대한 자세한 답변.

다른 팁

스파이 된 물체를 사용하면 두 가지 접근 방식이 다르게 행동합니다 (주석이 달린다. @Spy) 모의 대신 (주석이 달린다 @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은 왜 사용을 말하는 것 같습니다 doReturn() 대신에 when()드문 경우에 mockito.when (object)을 사용할 수없는 드문 경우에 Doreturn ()을 사용하십시오.

(객체)는 인수 유형-안전하고 더 읽기 쉬운 (특히 연속 통화를 스터브 할 때)이기 때문에 항상 스튜빙에 권장되는 경우 mockito.

Doreturn ()가 편리하게 오는 드문 경우가 있습니다.

1. 스파이에서 실제 물체를 감시하고 실제 방법을 호출 할 때 부작용이 발생합니다.

List list = new LinkedList(); List spy = spy(list);

// 불가능 : 실제 방법은 so spy.get (0)을 indexoutofBoundsexception (목록은 아직 비어 있음)이라고합니다.

when(spy.get(0)).thenReturn("foo");

// Stubbing에 Doreturn ()을 사용해야합니다. doReturn("foo").when(spy).get(0);

2. 이전 예외 스튜빙을 우선적으로

when(mock.foo()).thenThrow(new RuntimeException());

// 불가능 : 예외 스튜브 foo () 메소드가 호출되어 runtimeexception이 던져집니다. when(mock.foo()).thenReturn("bar");

// Stubbing에 Doreturn ()을 사용해야합니다.

doReturn("bar").when(mock).foo(); 위의 시나리오는 Mockito의 우아한 구문의 트레이드 오프를 보여줍니다. 그러나 시나리오는 매우 드 rare니다. 스파이는 산발적이어야하며 예외 스튜빙을 우선적으로 사용하는 것은 매우 드 rare니다. 일반적으로 재정의 스터 빙은 너무 많은 스터브를 지적하는 잠재적 코드 냄새입니다.

계속합니다 이 답변, 예를 들어 처음으로 호출 된 경우, 두 번째 시간이 부르는 등 다른 값을 반환하려면 또 다른 차이점이 있습니다. 예를 들어 ... 값을 전달할 수 있습니다 ... 예를 들어 ...

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

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

후자의 대안은 반환되는 모의 방법에 사용됩니다. void.

예를 들어 다음과 같이 살펴보십시오.mockito와 함께 무효 방법으로 모의를 만드는 방법

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top