본문 바로가기

Spring/Testing

Mockito & MockMvc

@ExtendWith(MockitoExtension.class)
class ItemRegisterControllerTest {

    @InjectMocks
    private ItemRegisterController itemRegisterController;
    @Mock
    private ItemRegisterService itemRegisterService;
    private MockMvc mockMvc;

    private ItemSaveForm saveForm;
    private ItemDTO itemDTO;
    ObjectMapper mapper = new ObjectMapper();

    @Before
    public void initAll(){
        mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    }

    @BeforeEach
    public void initEach(){
        mockMvc = MockMvcBuilders.standaloneSetup(itemRegisterController).build();
        saveForm = new ItemSaveForm("testItem", 1000);
        itemDTO = new ItemDTO("testItem", 1000);

    }

    @Test
    @DisplayName("Item 저장 확인 - Controller")
    void saveNewItem() throws Exception {
        //given
        when(itemRegisterService.saveNewItem(any(ItemEntity.class))).thenReturn(itemDTO);

        //when
        ResultActions response = mockMvc.perform(post("http://localhost:8080/item/save")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(mapper.writeValueAsString(saveForm)));

        //then
         response.andExpect(status().isOk())
                    .andExpect(MockMvcResultMatchers.jsonPath("$.itemName").value("testItem"))
                   // .andExpect(MockMvcResultMatchers.jsonPath("$.itemPrice", CoreMatchers.is(itemDTO.getItemPrice())))
                    .andDo(MockMvcResultHandlers.print());
    }
    }

 

1. Mockito

  • @ Mock: 가짜 객체 만들어줌
  • @InjectMock:  Mock객체 주입해야 되는 대상에 넣음
  • @Spy: 특정 객체의 실제 메소드 호출

2. Mockito Stubbing & BDDMockito

  • doReturn(): 가짜 객체가 특정한 값 반환하게 함.
  • doNothing():  아무것도 반환하지 않음(void)
  • doThrow(): 예외 발생
  • thenReturn(): 실제 메소드를 호출(doReturn()은 실제 메소드를 호출하지 않음)
  • veryfy(): 스터빙 검증
  • when(): 스터빙 설정

3. BDDMockito

  • when() -> given()
  • thenReturn() -> willReturn()
  • verify() -> then().should()

3. MockMvc 기본

-1. @ExtendWith(MockitoExtension.class)이용

-2. @WebMvcTest

  • MockMvc 객체 자동생성
  • ControllerAdvice, Filter, Interceptor 등 빈으로 등록

-> 그러나 컨텍스트 캐싱 대신 새로운 컨텍스트 생성 필요하여 느림.

이때, @Mock, @Spy대신  @MockBean, @SpyBean을 사용하여야 함. 

 

4. MockMvc 메소드

  • perform(): mock http요청
  • get(): GET Method
  • post(): post Method
  • params(): 파라미터
  • andExpect(): 응답 검증
    • status(): 상태 검증
    • view(): 뷰이름
    • content(): 응답 정보
    • model(): 모델 정보

 

예시:

Easy2Exel: https://www.youtube.com/watch?v=XASyDbfQYaw

wedul: https://wedul.site/131

 

공식 페이지: 

https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#mock-java.lang.Class-

 

출처: 

iseon_u: https://velog.io/@iseon_u/Mockito-%EA%B8%B0%EB%B0%98%EC%9D%98-Controller-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8

royless9: https://royleej9.tistory.com/entry/Mockito-doReturn-thenReturn

 

해어린: https://shinsunyoung.tistory.com/52

lxxjn0.log: https://velog.io/@lxxjn0/Mockito%EC%99%80-BDDMockito%EB%8A%94-%EB%AD%90%EA%B0%80-%EB%8B%A4%EB%A5%BC%EA%B9%8C

JaeHoney: https://jaehoney.tistory.com/220

 effortguy: https://effortguy.tistory.com/144

'Spring > Testing' 카테고리의 다른 글

AssertJ  (0) 2024.02.01
HTTP 응답코드  (0) 2024.02.01
스프링 테스트중 에러  (0) 2024.02.01