fastcampus-eatgo icon indicating copy to clipboard operation
fastcampus-eatgo copied to clipboard

MockObject관련해서 궁금한게 있습니다.

Open ShinGyeongseon opened this issue 4 years ago • 1 comments

우선 아샬님 강의 보면서 이해가 안가는 부분은 많지만 열심히 공부하고 있습니다. 그런데 정말 궁금한 점이 있습니다.

현재는 가짜객체 부분을 배우고 있습니다. 그런데 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) 같은게 있을까요 ?! ㅠㅠ

정말 궁금합니다 !!

ShinGyeongseon avatar May 09 '20 15:05 ShinGyeongseon

  1. @Mock@MockBean은 완전히 다릅니다.
  2. 말씀하신 것처럼 @Mock 어노테이션이 붙은 필드를 초기화해 줍니다.
  3. thisRestaurantServiceTest의 인스턴스입니다. 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를 쓴다는 것도 확인하실 수 있습니다.

처음에는 공식 문서를 읽는 게 어려울 수 있는데, “나에게 지금 필요한 게 무엇인가?”를 자주 되물으면 좋습니다. 물론 처음부터 완벽한 답을 얻는 건 쉽지 않습니다. “구구단을 왜 외워야 하는가?”를 제대로 이해하는 건 대부분 구구단을 외우고 한참이 지나고 나서일 가능성이 크죠. 이건 좀 어려운 문제긴 한데, 집요하게 파고 들어서 답을 내는 일 자체가 재밌어지는 게 제일 좋습니다. 어릴 때 뭔가를 시작한 사람들이 유리한 지점이 흥미를 갖기 쉽다는데 있죠(반대로 쉽게 흥미를 잃기도 하고요).

ahastudio avatar Sep 27 '20 16:09 ahastudio