[JUnit & Mockito] Spying

원알렉스·2020년 8월 28일
0

JUnit & Mockito

목록 보기
5/9
post-thumbnail

🚀 Mock Object 사용 시 주의사항

Mock Object 를 생성할 때, 생성한 객체는 지정한 클래스의 행동(Behavior)를 가지지 못합니다. 즉, 개발자가 직접 해당 객체의 행동을 지정하지 않는 이상(when(), thenReturn()) 해당 객체가 수행하는 모든 행동은 디폴트 값으로 수행하게 됩니다.

@Test
public void withoutSpying() {
    ArrayList<String> mockList = mock(ArrayList.class);

    System.out.println(mockList.get(0));  // null
    System.out.println(mockList.size());  // 0

    mockList.add("Test String 1");  // 영향 없음
    mockList.add("Test String 2");

    System.out.println(mockList.size());  // 0

    when(mockList.size()).thenReturn(5);
    System.out.println(mockList.size());  // 5
}

✓ Spying

Spying 은 Mock 과 다르게 지정한 클래스의 행동(Behavior)을 그대로 가지게 됩니다. 즉, 개발자가 직접 해당 객체의 행동을 지정하지 않아도 되고, 만약 지정을 하게 된다면 기존의 행동을 재정의하게 됩니다.

@Test
public void spying() {
    ArrayList<String> spyList = spy(ArrayList.class);

    //System.out.println(spyList.get(0));  // IndexOutOfBoundsException
    System.out.println(spyList.size());  // 0

    spyList.add("Test String 1");
    spyList.add("Test String 2");

    System.out.println(spyList.size());  // 2
    System.out.println(spyList.get(0));  // Test String 1
    System.out.println(spyList.get(1));  // Test String 2

    when(spyList.size()).thenReturn(10);  // 행동 재정의
    System.out.println(spyList.size());  // 10
}
profile
Alex's Develog 🤔

0개의 댓글