1. 개요

이 짧은 튜토리얼에서는 Mockito로 void 메서드 를 조롱하는 데 중점을 둡니다.

Mockito 프레임 워크에 초점을 맞춘 다른 기사 (예 : Mockito Verify , Mockito When / Then , Mockito 's Mock Methods ) 마찬가지로 아래 표시된 MyList 클래스는 테스트 케이스에서 공동 작업자로 사용됩니다.

이 자습서에 대한 새로운 방법을 추가합니다.

public class MyList extends AbstractList<String> {
 
    @Override
    public void add(int index, String element) {
        // no-op
    }
}

2. 간단한 조롱 및 검증

공허 방법은 Mockito의 사용할 수 있습니다 doNothing () , doThrow () , 및 doAnswer () 메소드, 조롱을하고 직관적 확인 :

@Test
public void whenAddCalledVerified() {
    MyList myList = mock(MyList.class);
    doNothing().when(myList).add(isA(Integer.class), isA(String.class));
    myList.add(0, "");
 
    verify(myList, times(1)).add(0, "");
}

그러나 doNothing ()void 메서드에 대한 Mockito의 기본 동작입니다 .

이 버전의 whenAddCalledVerified ()위와 동일한 작업을 수행합니다.

@Test
public void whenAddCalledVerified() {
    MyList myList = mock(MyList.class);
    myList(0, "");
 
    verify(myList, times(1)).add(0, "");
}

DoThrow () 는 예외를 생성합니다.

@Test(expected = Exception.class)
public void givenNull_AddThrows() {
    MyList myList = mock(MyList.class);
    doThrow().when(myList).add(isA(Integer.class), isNull());
 
    myList.add(0, null);
}

아래에서 doAnswer ()를 다룰 것 입니다.

3. 인수 캡처

doNothing () 으로 기본 동작을 재정의하는 한 가지 이유 는 인수를 캡처하기위한 것입니다.

위의 예에서는 verify () 메서드를 사용하여 add ()에 전달 된 인수를 확인했습니다 .

그러나 우리는 논쟁을 포착하고 더 많은 것을해야 할 수도 있습니다.

이 경우 위에서했던 것처럼 doNothing () 을 사용 하지만 ArgumentCaptor를 사용합니다 .

@Test
public void whenAddCalledValueCaptured() {
    MyList myList = mock(MyList.class);
    ArgumentCaptor<String> valueCapture = ArgumentCaptor.forClass(String.class);
    doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
    myList.add(0, "captured");
 
    assertEquals("captured", valueCapture.getValue());
}

4. 무효 전화 받기

메서드는 단순히 값을 추가하거나 설정하는 것보다 더 복잡한 동작을 수행 할 수 있습니다.

이러한 상황에서는 Mockito의 답변사용 하여 필요한 동작을 추가 할 수 있습니다 .

@Test
public void whenAddCalledAnswered() {
    MyList myList = mock(MyList.class);
    doAnswer(invocation -> {
        Object arg0 = invocation.getArgument(0);
        Object arg1 = invocation.getArgument(1);
        
        assertEquals(3, arg0);
        assertEquals("answer me", arg1);
        return null;
    }).when(myList).add(any(Integer.class), any(String.class));
    myList.add(3, "answer me");
}

Mockito의 Java 8 Features에 설명 된 대로 , 우리 add ()에 대한 사용자 정의 동작을 정의하기 위해 Answer 와 함께 람다를 사용합니다 .

5. 부분 조롱

부분 모의도 옵션입니다. Mockito의 doCallRealMethod ()void 메서드에 사용할 수 있습니다 .

@Test
public void whenAddCalledRealMethodCalled() {
    MyList myList = mock(MyList.class);
    doCallRealMethod().when(myList).add(any(Integer.class), any(String.class));
    myList.add(1, "real");
 
    verify(myList, times(1)).add(1, "real");
}

이렇게하면 실제 메서드를 호출하고 동시에 확인할 수 있습니다.

6. 결론

이 간략한 기사에서는 Mockito로 테스트 할 때 void 메서드 에 접근하는 네 가지 방법을 다뤘습니다.

항상 그렇듯이이 GitHub 프로젝트 에서 예제를 사용할 수 있습니다 .