[Test] Mockito


이번 글에서는 Java 테스트를 위한 Mockito를 알아보자 !

Java Test

Java, 특히 Spring에서의 테스트는 Spring을 지탱하고 있는 양대 산맥중 하나이다. (나머지 산맥 하나는 객체지향 이라는 “토비”님의 말씀이…)

테스트를 배워가며 적용하다보니, 테스트를 먼저 base로 작업한 후, 상세 구현을 하는 것이 여러모로 편리하다는 점을 느꼈다 !! 다음에 신규 기능을 추가할 일이 생기면, 꼭 TDD를 사용하여 개발을 해보아야겠다.

우선, Mockito는 MIT 라이센스의 오픈소스 자바 테스팅 프레임워크로써, 다음 주소에서 상세한 정보를 얻을 수 있다.

  • http://mockito.org/
  • https://github.com/mockito/mockito

Mockito를 이제 한번 다뤄보자.

Verify Interactions

Mockito는 다음과 같이 생성하고, verify해볼 수 있다.

Mock을 생성할 때에는 mock()을 통하거나 @Mock 어노테이션을 이용하여 생성할 수 있다.

    import static org.mockito.Mockito.*;
    
    // mock creation
    List mockedList = mock(List.class);
    
    // using mock object - it does not throw any "unexpected interaction" exception
    mockedList.add("one");
    mockedList.clear();
    
    // selective, explicit, highly readable verification
    verify(mockedList).add("one");
    verify(mockedList).clear();

Stub Method Calls

stubing은 메소드가 실행될 때, 반환될 결과값을 미리 정해주는 것이다.

    // you can mock concrete classes, not only interfaces
    LinkedList mockedList = mock(LinkedList.class);
    
    // stubbing appears before the actual execution
    when(mockedList.get(0)).thenReturn("first");
    
    // the following prints "first"
    System.out.println(mockedList.get(0));
    
    // the following prints "null" because get(999) was not stubbed

    System.out.println(mockedList.get(999));

More

Answer,ReturnValues,MockSettings를 통해서, 어떻게 수행되어야하는지를 특정지을 수 있다.

when(), given()을 통해서 mock이 어떻게 행동해야하는지를 정할 수 있다.

spy, @Spy를 통해서, 부분적 목킹을 할 수 있는데, 실제 메소드들은 invoked되지만 검증되어지고 스터빙되어진다.

@InjectMocks 어노테이션을 통해서 목/스파이를 자동적으로 주입할 수 있다.

verify() 메소드를 통해서 메소드가 주어진 arguments들 속에서 호출 되었는지를 체크할 수 있다. any()나 @Captor 같은 것을 이용하여 유연한 argument matching을 할 수 있다.