티스토리 뷰

728x90

1. 스프링 부트에서 REST에서 xml 형식으로 서비스를 지원하고 싶은 경우 간단하게 pom에 의존성을 추가하면 된다.

  1-1 스프링 부트를 사용하지 않는 경우에는 ContentNegotiatingViewResolver를 등록하고 라이브러리 지정해야 한다.

 

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

  

  1-2 jackson xml를 사용하지 않는 경우에는 JAXB를 사용할 수 있다.

    1-2-1 문제는 jaxb는 java 8에 포함되어 배포되어 Java 8 버전 이상을 사용할 경우에는 jaxb를 별도로 추가해야 한다.

 

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>

 

  1-3 서비스 호출 시에는 Accept: text/xml를 추가해야 json이 아닌 xml형식의 서비스를 수신할 수 있다.

 

 

2. 이렇게 xml을 서비스 하게 되면 테스트 작성 시 반드시 accept 헤드를 추가하여 어떤 형식을 수신할지 지정해야 한다.

 

package pe.pilseong.restdemo.controller.v1;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;

import java.util.Arrays;
import java.util.List;

import org.hamcrest.Matchers;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import pe.pilseong.restdemo.api.v1.model.CategoryDTO;
import pe.pilseong.restdemo.controller.RestResponseEntityExceptionHandler;
import pe.pilseong.restdemo.domain.Category;
import pe.pilseong.restdemo.service.CategoryService;
import pe.pilseong.restdemo.service.ResourceNotFoundException;

public class CategoryControllerTest {

  @Mock
  CategoryService categoryService;

  @InjectMocks
  CategoryController categoryController;

  MockMvc mockMvc;

  private static final String NAME = "Ebook";
  private static final long ID = 1L;

  Category category;
  CategoryDTO categoryDto;

  @BeforeEach
  public void setup() {
    MockitoAnnotations.initMocks(this);

    mockMvc = MockMvcBuilders.standaloneSetup(categoryController)
      .setControllerAdvice(new RestResponseEntityExceptionHandler())
      .build();

    category = new Category();
    category.setId(ID);
    category.setName(NAME);

    categoryDto = new CategoryDTO();
    categoryDto.setId(ID);
    categoryDto.setName(NAME);
  }

  @Test
  public void listCategories() throws Exception {

    List<CategoryDTO> categories = Arrays.asList(new CategoryDTO(), new CategoryDTO());
  
    // given
    when(categoryService.getCategories()).thenReturn(categories);

    mockMvc.perform(MockMvcRequestBuilders.get("/api/v1/categories")
        .contentType(MediaType.APPLICATION_JSON)
        .accept(MediaType.APPLICATION_JSON))
      .andExpect(MockMvcResultMatchers.status().isOk())
      .andExpect(MockMvcResultMatchers.jsonPath("$.categories", Matchers.hasSize(2)));
  }

  @Test
  public void getCategoryByName() throws Exception {

    when(categoryService.getCategoryByName(anyString())).thenReturn(categoryDto);

    mockMvc.perform(MockMvcRequestBuilders.get("/api/v1/categories/Ebook")
        .contentType(MediaType.APPLICATION_JSON)
        .accept(MediaType.APPLICATION_JSON))
      .andExpect(MockMvcResultMatchers.status().isOk())
      .andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.equalTo(NAME)));
  }

  @Test
  public void getCategoryByNameNotFound() throws Exception {
    when(categoryService.getCategoryByName(anyString())).thenThrow(ResourceNotFoundException.class);

    mockMvc.perform(MockMvcRequestBuilders.get("/api/v1/categories/Ebook").contentType(MediaType.APPLICATION_JSON))
      .andExpect(MockMvcResultMatchers.status().isNotFound());
  }
}
728x90
댓글