단위 테스트를 위한 Java Mocking Framework
이다. JUnit
에서 가짜 객체인 Mock
을 생성해주고 관리하고 검증할 수 있도록 지원해주는 Framework이다. 구현체가 아직 없는 경우나 구현체가 있더라도 특정 단위만 테스트하고 싶을 경우 사용할 수 있도록 적절한 환경을 제공해준다.
Mockito에서 Mock 객체를 제공해준다고 위에서 언급이 되었는데, Mock 객체란 다음과 같다. Mock 객체란 개발한 프로그램을 테스트할 때 테스트를 수행할 모듈과 연결되는 외부의 다른 모듈을 흉내 내는 가짜 모듈을 생성하여 테스트의 효율성을 높이는 데 사용하는 객체이다.
CommentService의 registerComment 메소드를 테스트하려 한다. registerComment 메소드가 적절한 인자와 함께 호출이 되어 CommentDao의 insertComment까지 정상적으로 호출하는지 테스트 하고 싶다. insertComment의 테스트 여부는 관심없고, insertComment메서드만 제대로 호출이 되는지가 테스트의 주된 관심사이다.
Mock 객체는 이러한 상황에서 CommentDao를 가짜 모듈로써 사용할 수 있도록 도와준다. 즉, CommentDao를 Mock객체
로 사용하여 insertComment가 정상적인 리턴 값을 던져주도록 도와주고, 이로써 registerComment 메소드의 단위 테스트만 확인 할 수 있도록 도와준다.
mock() : Mock 객체를 생성해주는 메소드
when() : Mock 객체의 메소드 반환 값을 지정해주는 메소드
verify() : Mock 객체에서 메소드가 호출 되었는지를 확인해주는 메소드
times() : 지정한 횟수 만큼 Mock 객체의 메소드가 호출 되었는지를 확인해주는 메소드
never() : Mock 객체의 메소드가 호출 안되었는지를 확인해주는 메소드
atLeast(), atMost() : Mock 객체의 메소드가 최소, 최대 지정 횟수 만큼 호출 되었는지를 확인해주는 메소드
timeOut() : Mock 객체의 메소드가 지정된 시간안에 호출되었는지를 확인해주는 메소드
@Mock
@MockBean
@Spy
@SpyBean
@InjectMocks
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"));
}
}
@mock
annotation을 붙입니다. 이 annotation은 mock
을 합성하고자 하는 곳을 의미.@InjectMocks
annotation을 붙입니다. 이 annotation은 mock
을 주입하고자 하는 대상을 의미.@Before
메서드에서 AddressRetriever 클래스의 인스턴스를 생성@mock
annotation이 붙은 필드를 가져와서 각각에 대해 mock
인스턴스를 합성. 그다음 어떤 @InjectMocks
annotation이 붙은 필드를 가져와서 mock
객체들을 거기에 주입(AddressRetriever 인스턴스)