Mockito

2020. 4. 1. 12:20Java/Test

Mockito란

Mockito의 개념

Mockito란 단위 테스트를 위한 Java Mocking Framework입니다. 여기서 Mock이란 단위 테스트를 위한 가짜 객체를 말하는 것입니다. 즉, Mockito는 단위 테스트를 위해 Mock이라는 가짜 객체를 만들어주는 프레임워크입니다. Mockito는 Mock 객체 생성, 객체 동작을 지정 그리고 테스트 대상 로직이 제대로 수행 되었는지 확인이 가능합니다.

Mockito의 다양한 기능

Mock(), @Mock
Mock 객체를 만들어서 반환하는 기능입니다.

import static org.mockito.Mockito.*;

// mock 처리를 합니다.
// Annotation, mock() Method 같은 표현입니다.
@Mock
List annotationMockedList
List mockedList = mock(List.class);

//using mock object
mockedList.add("one");
mockedList.clear();

//검증 - 성공
verify(mockedList).add("one"); // add("one")가 호출되었는지 검증합니다.
verify(mockedList).clear(); // clear()가 호출되었는지 검증합니다.
//검증 - 실패
verify(mockedList).add("two"); // add("two")이 호출이 되지 않았기에 실패합니다.

Stubbing

// 구체적인 클래스를 mock 처리합니다.
LinkedList mockedList = mock(LinkedList.class);

//stubbing
when(mockedList.get(0)).thenReturn("first"); // get(0)이 호출되면 "first"를 반환합니다.
when(mockedList.get(1)).thenThrow(new RuntimeException()); // get(1)이 호출되면 RuntimeException 에러를 발생합니다.

System.out.println(mockedList.get(0)); // "first"
System.out.println(mockedList.get(1)); // RuntimeException()
System.out.println(mockedList.get(999)); // 999에 대한 stub 처리를 하지 않았기 때문에 null값이 return됩니다.

매개변수 검증

// 모든 Integer 타입 매개변수를 받을 경우 "element"를 돌려줍니다.
when(mockedList.get(anyInt())).thenReturn("element");

//커스텀 Matcher를 사용하여 stubing합니다.
when(mockedList.contains(argThat(isValid()))).thenReturn("element");

// "element"
System.out.println(mockedList.get(999));

// 검증 - Integer 타입 매개변수를 받으며 호출되었는지 검증합니다.
verify(mockedList).get(anyInt());
// 검증 - argument matchers
verify(mockedList).add(argThat(someString -> someString.length() > 5));

// 값을 검증할때에는 eq()로 감싸야 호출해야 합니다.
verify(mock).someMethod(anyInt(), anyString(), eq("third argument"));
// 그렇지 않을 경우 실패하게 됩니다.
verify(mock).someMethod(anyInt(), anyString(), "third argument");
아무일이 일어나지 않는 mock에 대한 검증
// mockOne만 add를 호출합니다.
mockOne.add("one");

// 일반적인 검증입니다.
verify(mockOne).add("one");
verify(mockOne, never()).add("two");

// 나머지 mock은 아무 일이 발생하지 않았기 때문에 그 부분에 대한 검증입니다.
verifyZeroInteractions(mockTwo, mockThree);

연속적인 Stubbing

when(mock.someMethod("some arg"))
.thenThrow(new RuntimeException()) // 첫번째 Return
.thenReturn("foo");                // 두번째 Return

//첫번째 call: throws runtime exception:
mock.someMethod("some arg");

//두번째 call: "foo"
System.out.println(mock.someMethod("some arg"));

//가장 마지막 Stubbing한 값을 Return 합니다.
System.out.println(mock.someMethod("some arg"));

// 호출한 순서대로 결과값을 Return 합니다.
when(mock.someMethod("some arg"))
.thenReturn("one", "two", "three");

Mockito 메소드 종류

Mock()
모의 객체를 생성하는 역할

When()
협력 객체 메소드 반환 값을 지정해주는 역할

Verify()
()안의 협력 객체 메소드가 호출되었는지 확인

Times()
지정한 횟수 만큼 협력 객체 메소드가 호출 되었는지 확인

Never()
호출 되지 않았는지 여부 검증

atLeastOnce()
최소 한 번은 특정 메소드가 호출되었는지 확인

atLeast()
최소 지정한 횟수 만큼 호출되었는지 확인

atMost()
최대 지정한 횟수 만큼 호출되었는지 확인

Clear()
Stub을 초기화

timeOut()
지정된 시간 안에 호출되었는지 확인

728x90

'Java > Test' 카테고리의 다른 글

Junit5  (0) 2020.04.01
JUnit  (0) 2020.03.30