mockito

Daniel6364·2022년 7월 29일
0

Mockito란?

단위 테스트를 위한 Java Mocking Framework이다. JUnit에서 가짜 객체인 Mock을 생성해주고 관리하고 검증할 수 있도록 지원해주는 Framework이다. 구현체가 아직 없는 경우나 구현체가 있더라도 특정 단위만 테스트하고 싶을 경우 사용할 수 있도록 적절한 환경을 제공해준다.

Mock 객체란?

Mockito에서 Mock 객체를 제공해준다고 위에서 언급이 되었는데, Mock 객체란 다음과 같다. Mock 객체란 개발한 프로그램을 테스트할 때 테스트를 수행할 모듈과 연결되는 외부의 다른 모듈을 흉내 내는 가짜 모듈을 생성하여 테스트의 효율성을 높이는 데 사용하는 객체이다.

CommentService의 registerComment 메소드를 테스트하려 한다. registerComment 메소드가 적절한 인자와 함께 호출이 되어 CommentDao의 insertComment까지 정상적으로 호출하는지 테스트 하고 싶다. insertComment의 테스트 여부는 관심없고, insertComment메서드만 제대로 호출이 되는지가 테스트의 주된 관심사이다.

Mock 객체는 이러한 상황에서 CommentDao가짜 모듈로써 사용할 수 있도록 도와준다. 즉, CommentDao를 Mock객체로 사용하여 insertComment가 정상적인 리턴 값을 던져주도록 도와주고, 이로써 registerComment 메소드의 단위 테스트만 확인 할 수 있도록 도와준다.

Mockito 메서드 종류

  1. mock() : Mock 객체를 생성해주는 메소드

    • ex) Person p = mock(Person.class); -> Person을 Mock 객체로 생성
  2. when() : Mock 객체의 메소드 반환 값을 지정해주는 메소드

    • ex) when(p.getName()).thenReturn("min"); -> p.getName()이 호출되었을 때 min을 반환하도록 지정
  3. verify() : Mock 객체에서 메소드가 호출 되었는지를 확인해주는 메소드

    • ex) verify(p).getName(); -> p.getName()이 호출되었는지를 확인
  4. times() : 지정한 횟수 만큼 Mock 객체의 메소드가 호출 되었는지를 확인해주는 메소드

    • ex) verify(p, times(1)).getName(); -> p.getName()이 1번 호출되었는지를 확인
  5. never() : Mock 객체의 메소드가 호출 안되었는지를 확인해주는 메소드

  6. atLeast(), atMost() : Mock 객체의 메소드가 최소, 최대 지정 횟수 만큼 호출 되었는지를 확인해주는 메소드

  7. timeOut() : Mock 객체의 메소드가 지정된 시간안에 호출되었는지를 확인해주는 메소드

Mockito annotation

@Mock
@MockBean
@Spy
@SpyBean
@InjectMocks

annotation example

public class AddressRetrieverTest {
   @Mock private Http http;
   @InjectMocks private AddressRetriever retriever;
   
   @Before
   public void createRetriever() {
      retriever = new AddressRetriever();
      MockitoAnnotations.initMocks(this);
   }

   @Test
   public void answersAppropriateAddressForValidCoordinates() 
         throws IOException, ParseException {
      when(http.get(contains("lat=38.000000&lon=-104.000000")))
         .thenReturn("{\"address\":{"
                        + "\"house_number\":\"324\","
         // ...
                        + "\"road\":\"North Tejon Street\","
                        + "\"city\":\"Colorado Springs\","
                        + "\"state\":\"Colorado\","
                        + "\"postcode\":\"80903\","
                        + "\"country_code\":\"us\"}"
                        + "}");

      Address address = retriever.retrieve(38.0,-104.0);
      
      assertThat(address.houseNumber, equalTo("324"));
      assertThat(address.road, equalTo("North Tejon Street"));
      assertThat(address.city, equalTo("Colorado Springs"));
      assertThat(address.state, equalTo("Colorado"));
      assertThat(address.zip, equalTo("80903"));
   }
}
  • http 필드를 선언, @mock annotation을 붙입니다. 이 annotation은 mock을 합성하고자 하는 곳을 의미.
  • retriever 필드를 선언하고 @InjectMocks annotation을 붙입니다. 이 annotation은 mock을 주입하고자 하는 대상을 의미.
  • @Before 메서드에서 AddressRetriever 클래스의 인스턴스를 생성
  • MockitoAnnotations.initMocks(this)를 호출 모키토는 테스트 클래스에서 어떤 @mock annotation이 붙은 필드를 가져와서 각각에 대해 mock 인스턴스를 합성. 그다음 어떤 @InjectMocks annotation이 붙은 필드를 가져와서 mock객체들을 거기에 주입(AddressRetriever 인스턴스)
profile
The Office Lover

0개의 댓글