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 은 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
}