관리 메뉴

JIE0025

[MockMvc] CategoryControllerTest (1) depth가 0인 카테고리 추가 본문

백엔드/테스트

[MockMvc] CategoryControllerTest (1) depth가 0인 카테고리 추가

Kangjieun11 2022. 12. 17. 15:15
728x90

package com.FlagHome.backend.v1.category.controller

 

💻 CategoryControllerTest

 

MockMvc를 좀더 공부해봐야겠다. 지금은 따라쳐보고 무슨 기능하는지 이해하는 정도... 

그래도 연습이 되어서 좋다!

 

조만간 싹다 지우고 다시 써봐야지

 

package com.FlagHome.backend.v1.category.controller;

import com.FlagHome.backend.v1.category.dto.CategoryDto;
import com.FlagHome.backend.v1.category.entity.Category;
import com.FlagHome.backend.v1.category.repository.CategoryRepository;
import com.FlagHome.backend.v1.post.entity.Post;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;

import javax.transaction.Transactional;

import java.util.List;

import static org.hamcrest.core.Is.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

//컨트롤러 테스트 :

//@WebMvcTest는 @Controller, @ControllerAdvice만 사용가능하고, @Repository, @Service는 사용할 수 없어서 이 어노테이션은 사용하지 않는다.

@SpringBootTest // @Service, @Repository를 사용 + JPA 테스트를 위한 어노테이션
@Transactional
@WithMockUser
@AutoConfigureMockMvc  // MockMvc를 사용하기 위한 어노테이션
public class CategoryControllerTest {

    private final String BASE_URL = "/v1/categories";

    @Autowired
    private CategoryRepository categoryRepository;

    @Autowired
    private ObjectMapper objectMapper;
    //  Java 객체를 JSON으로 serialization || JSON 컨텐츠를 Java객체로 deserialization
    @Autowired
    private WebApplicationContext webApplicationContext;
    @Autowired
    private MockMvc mockMvc;

    @Mock
    private Category mockCategory;

    @BeforeEach
    public void testSetup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
                .addFilter(new CharacterEncodingFilter("UTF-8",true))
                .build();
    }

    @Test
    @DisplayName("depth가 0인 카테고리 추가 테스트")
    void createCategoryDepth0Test() throws Exception {
        //given 테스트용 request body 생성
        CategoryDto categoryDto = new CategoryDto();

        String name = "FLAG";
        Long depth = 0L;

        categoryDto.setName(name);
        categoryDto.setCategoryDepth(depth);

        //직렬화 메서드 : JSON타입의 String으로 저장
        String jsonBody = objectMapper.writeValueAsString(categoryDto);

        // when -> perform      : MockMvc 객체로 테스트 대상 Controller 호출
        // then -> andExpect부터 : Controller 핸들러 메서드에서 응답으로 수신한 HTTP Status 및 response body 검증
        mockMvc.perform(post(BASE_URL)  // 넣어준 컨트롤러의 Http Method 와 URL 을 지정
                        .content(jsonBody) //Body 삽입
                        .contentType(MediaType.APPLICATION_JSON))
                .andDo(print());

        List<Category> categoryList = categoryRepository.findAll();
        assert categoryList.size() == 1;

        Category createdCategory = categoryList.get(0);
        assert createdCategory.getId().equals(1L);
        assert createdCategory.getName().equals(name);
        assert createdCategory.getCategoryDepth().equals(depth);

    }
}

 

✔️ 테스트결과