fastcampus-eatgo
fastcampus-eatgo copied to clipboard
MockObject관련해서 궁금한게 있습니다.
우선 아샬님 강의 보면서 이해가 안가는 부분은 많지만 열심히 공부하고 있습니다. 그런데 정말 궁금한 점이 있습니다.
현재는 가짜객체 부분을 배우고 있습니다.
그런데
RestaurantControllerTest
부분서
@MockBean
객체를 만들고
@Test
안에서 given
을 통해 서비스에 필요한 객체를 willReturn
하는 것까지는 이해가 갑니다.
그런데 RestaurantServiceTest
에서
package eatgo.domain.application;
import eatgo.domain.*;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import java.util.List;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;
public class RestaurantServiceTest {
private RestaurantService restaurantService;
@Mock
private RestaurantRepository restaurantRepository;
@Mock
private MenuItemRepository menuItemRepository;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
restaurantService = new RestaurantService(
restaurantRepository, menuItemRepository);
}
@Test
public void getRestaurants() {
List<Restaurant> restaurants = restaurantService.getRestaurants();
Restaurant restaurant = restaurants.get(0);
assertThat(restaurant.getId(), is(1004L));
}
@Test
public void getRestaurant() {
Restaurant restaurant = restaurantService.getRestaurant(1004L);
assertThat(restaurant.getId(), is(1004L));
MenuItem menuItem = restaurant.getMenuItems().get(0);
assertThat(menuItem.getName(), is("kimchi"));
}
}
궁금한 점 !!
Q1. 밑에서 @MockBean
이 아니라 @Mock
을 사용하시는지 궁금합니다.
Q2. MockitoAnnotations.initMocks(this)
에서 해당 메서드는 위에 @Mock
어노테이션에서 클래스명이 같은 객체를 자동으로 인스턴스화를 해주는 건가요 ?!!
Q3. MockitoAnnotations.initMocks(this)
에서 this
는 무엇인가요 ?!!
그리고 정말 궁금한 점이 ㅠㅠ 정말 찾아도 ... 찾아도 제가 원하는 답은 안나오는데 이런거 어디서 짠하고 찾을 수 있는 방법이나 , 혹은 해석하려면 무엇을 공부하고 무슨 팁(Tip) 같은게 있을까요 ?! ㅠㅠ
정말 궁금합니다 !!
-
@Mock
과@MockBean
은 완전히 다릅니다. - 말씀하신 것처럼
@Mock
어노테이션이 붙은 필드를 초기화해 줍니다. -
this
는RestaurantServiceTest
의 인스턴스입니다. JUnit은 테스트 인스턴스를 자동으로 생성해서 실행합니다.
@MockBean
은 사실 굉장히 극적으로 등장했고, 이게 없던 시절에는 불편한 방법을 썼습니다. TDD on Spring 영상의 28분 48초에 해당 내용이 나오고, 30분 40초부터 TDDBE에서 나온 Self Shunt를 활용하는 방식이 나옵니다. @MockBean
은 Spring Boot에서 직접 지원함으로써 이보다 한 단계 더 나아간 거죠.
필요한 걸 얻는 방법의 정석은 공식 문서를 읽는 겁니다. 예를 들어 @Mock
은 Mockito에 있고, @MockBean
은 Spring Boot에 있죠. 둘이 다르기 때문에 각각 다른 문서를 읽어야 합니다. MockitoAnnotations.initMocks
같은 경우도 마찬가지로 Mockito 문서에서 찾을 수 있고, 최신 버전에서는 initMocks
대신 openMocks
를 쓴다는 것도 확인하실 수 있습니다.
처음에는 공식 문서를 읽는 게 어려울 수 있는데, “나에게 지금 필요한 게 무엇인가?”를 자주 되물으면 좋습니다. 물론 처음부터 완벽한 답을 얻는 건 쉽지 않습니다. “구구단을 왜 외워야 하는가?”를 제대로 이해하는 건 대부분 구구단을 외우고 한참이 지나고 나서일 가능성이 크죠. 이건 좀 어려운 문제긴 한데, 집요하게 파고 들어서 답을 내는 일 자체가 재밌어지는 게 제일 좋습니다. 어릴 때 뭔가를 시작한 사람들이 유리한 지점이 흥미를 갖기 쉽다는데 있죠(반대로 쉽게 흥미를 잃기도 하고요).