유저 ID를 지군으로 신규 유저 객체 생성
-> 현재 쿠폰 확인
-> 신규 쿠폰 받기
-> 유저의 보유 쿠폰 개수 확인
- 테스트 그 자체에 집중한다.
테스트의 행위와 반응에만 집중해서 테스트 메소드를 작성할 수 있게 한다.- 테스트 스텁을 만드는 것과 검증을 분리시켰다.
- Mock 만드는 방법을 단일화했다.
- 테스트 스텁을 만들기 쉽다.
- API가 간단하다.
- 프레임워크가 지원해주지 않으면 안 되는 코드를 최대한 배제했따.
- 실패 시에 발생하는 에러추적이 깔끔하다.
<순서>
1. CreateMock
인터페이스에 해당하는 Mock 객체를 만든다.
2. Stub
테스트에 필요한 Mock 객체의 동작을 지정한다.
3. Exercise
테스트 메소드 내에서 Mock 객체를 사용한다.
4. Verify
메소드가 예상대로 호출됐는지 검증한다.
import static org.mockito.Mockito.*;
List MockedList = mock(List.class);
Mockito는 테스트를 수행하고 결과를 보자의 개념이다. 그래서 예상값 지정 부분이 없다.
when(Mock_객체의_메소드).thenReturn(리턴값);
when(Mock_객체의_메소드).thenThrow(예외);
// Stub 만들기
when (mockedList.get(0)).thenReturn("item");
when (mockedList.size()).thenReturn(1);
when(mockedList.get(1)).thenThrow(new RuntimeException());
verify(Mock_객체).Mock_객체의_메소드;
verify(Mock_객체, 호출횟수지정_메소드).Mock_객체의_메소드;
해당 동작을 했는지 확인한다.
verify (mockedList).add("item");
verify(mockedList, times(1)).add("item");
verify(mockedList, times(2)).add(box);
verify(mockedList, never()).add(car);
verify(mockedList, atLeastOnce()).removeAll();
verify(mockedList, atLeast(2)).size();
verify(mockedList, atMost(5)).add(box);
erify(mockedList, times(5)).add( any() );
: 어떤 객체가 해당 메소드의 인자로 와도 무방하고, 대신 행동만 성공하고 싶을 때 사용한다.
1. any
2. anyInteger, anyBoolean
3. anyCollection, anyCollectionOf
4. argThat(HamcrestMatcher)
5. eq
등등..
List firstMock = mock(List.class);
List secondMock = mock(List.class);
firstMock.add("item1");
secondMock.add("item2");
InOrder inOrder = inOrder(firstMock, secondMock); inOrder.verify(firstMock).add("item1"); inOrder.verify(secondMock).add("item2");
doThrow(new RuntimeException()).when(mockList).clear();
ArrayList<String> realList = new ArrayList<String>();
realList.add("Hello");
System.out.println(realList.get(0));
List mockedList = spy( realList );
SMART NULLS의 규칙
1. 기본형 래퍼 클래스는 해당 기본형 값으로 바꾼다.
2. String은 ""로 바꾼다.
3. 배열은 크기 0인 기본 배열 객체로 만들어준다.
4. Collection 계열의 빈 Collection 객체로 만든다.
import static org.mockito.BDDMockito.*;
// given
given(seller.askForBread()).willReturn(new Bread());
// when
Goods goods = shop.buyBread();
// then
assertThat(goods, containBread());