3.1 doReturn() 메서드

이제 마법이 온다...

가짜 모의 개체를 만들었지만 어떻게든 작동하려면 해당 개체가 필요하다고 가정해 보겠습니다. 특정 메서드가 호출되면 중요한 작업이 수행되거나 메서드가 특정 결과를 반환했습니다. 무엇을 해야 합니까?

Mockito 라이브러리를 사용하면 목 객체에 원하는 동작을 추가할 수 있습니다.

모의 객체가 특정 메서드가 호출될 때 특정 결과를 반환하도록 하려면 다음 코드를 사용하여 이 "규칙"을 객체에 추가할 수 있습니다.

Mockito.doReturn(result).when(an object).method name();

메서드 호출이 끝나면 method name?실제로 호출이 진행되지 않습니다. 이 메서드는 doReturn()개체의 메서드 호출을 모니터링하여 규칙을 작성하는 데 도움이 되는 특수 프록시 개체를 반환합니다.

다시. 그것은 모의 객체에 추가할 규칙을 작성하는 영리한 방법입니다 . 이러한 코드를 보았을 때 머릿속에서 올바르게 해석하려면 약간의 기술이 필요합니다. 경험과 함께 제공됩니다.

구체적인 사례가 필요하다고 생각합니다. 모의 클래스 객체를 만들고 ArrayList메서드에 size()숫자 10을 반환하도록 요청해 보겠습니다. 전체 코드는 다음과 같습니다.

@ExtendWith(MockitoExtension.class)
class DoReturnTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation () {
         //create a rule: return 10 when calling the size method
        Mockito.doReturn(10).when(mockList).size();

        //the method is called here and will return 10!!
        assertEquals(10, mockList.size());
    }
}

예, 이 코드는 작동하며 테스트는 실패하지 않습니다.

3.2 when() 메서드

모의 객체에 동작 규칙을 추가하는 또 다른 방법이 있습니다 Mockito.when(). 다음과 같습니다.

Mockito.when(an object.method name()).thenReturn(result);

이것은 이전 것과 동일한 모의 개체 동작 규칙을 작성하는 방법입니다. 비교하다:

Mockito.doReturn(result).when(an object).method name();

여기서 똑같은 일이 발생합니다-새로운 규칙의 구성.

사실, 첫 번째 예에는 두 가지 단점이 있습니다.

  • 통화 가 매우 혼란 스럽습니다.an object.method name()
  • methodname()메서드가 를 반환 하면 작동하지 않습니다 void.

자, 다음을 사용하여 가장 좋아하는 예를 적어 보겠습니다.Mockito.when()

@ExtendWith(MockitoExtension.class)
class WhenTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        //create a rule: return 10 when calling the size method
        Mockito.when(mockList.size() ).thenReturn(10);

        //the method is called here and will return 10!!
        assertEquals(10, mockList.size());
    }
}

3.3 doThrow() 메서드

모의 개체 메서드가 특정 결과를 반환하도록 만드는 방법을 알아냈습니다. 특정 예외를 발생시키려면 어떻게 해야 합니까? 로 보내시겠습니까 doReturn()?

메서드가 반환되지 않도록, 즉 예외를 throw하지 않으려면 를 사용하여 규칙을 설정해야 합니다 doThrow().

Mockito.doThrow(exception.class).when(an object).method name();

그리고 두 번째 옵션:

Mockito.when(an object.method name()).thenThrow(exception.class);

조금 기대되죠?

글쎄요, 당신은 이미 이해하기 시작했습니다. 예를 들어 수정해 보겠습니다.

@ExtendWith(MockitoExtension.class)
class DoThrowTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
        mockList.size(); //an exception will be thrown here
    }
}

특정 예외 객체를 던져야 하는 경우 다음 형식의 구성을 사용합니다.

Mockito.doThrow(new Exception()).when(an object).method name();

doThrow()메소드에 예외 객체를 전달하기만 하면 메소드 호출 중에 예외 객체가 발생합니다.