본문 바로가기
Spring

@WebMvcTest

by 스르나 2021. 7. 1.

 

WebMvcTest

 

WebMvcTest는 Controller를 테스트하기 위한 어노테이션이다.
WebMvcTest는 Controller를 테스트하기 위한 어노테이션이다.
WebMvcTest는 Controller를 테스트하기 위한 어노테이션이다.

 

3번 말했다 WebMvcTest는 Controller를 테스트하기 위한 어노테이션이다. 이것을 강조하는 이유는 WebMvcTest는 단위 테스트를 위한 테스트 어노테이션임을 정확하게 이해하기 위해서다.

 

WebMvcTest는 Controller가 정상적으로 작동하는지 테스트하는 것이기 때문에 Web과 관련된 의존성만을 가지고 온다.

 

WebMvcTest에서 가져오는 의존성들 즉, 다음 어노테이션들만 ComponentScan해서 가져온다.

@Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, HandlerInterceptor

 

그렇기 때문에 Service, Repository등의 어노테이션을 컨트롤러에서 사용하고 있어도 가져와서 사용하지 않는다.

 

@RestController
public class MyController {

    @Autowired
    CompanyService companyService;


    @GetMapping("/employeeList")
    public List<EmployeeDto> getEmployeeList(){
        return companyService.getEmployeeList();
    }
    
    
    				
                    .
                    .
                    .

 

@Service
public class CompanyService{

    private final static String companyName="개발회사";

    private EmployeeService employeeService;

    @Autowired
    public CompanyService(EmployeeService employeeService){
        this.employeeService=employeeService;
    }



    public List<EmployeeDto> getEmployeeList(){
        return  IntStream
                .iterate(10000,a->a+1)
                .limit(10010)
                .mapToObj(num->employeeService.getEmployeeById(num))
                .collect(Collectors.toList());
    }
}

 

 

위 같이 컨트롤러에서 Service어노테이션이 붙은 Spring Bean을 가져와서 사용할때 WebMvcTest를 하면 에러가 난다.

 

 

그 이유는 당연하게도 Service가 붙은 Spring Bean을 찾지 못해서이다. 이럴때는 다른(WebMvcTest에서 스캔하지않는) Spring Bean은 Mocking해서 사용하는 것이 정석이다.

 

 

@ExtendWith(MockitoExtension.class)
@WebMvcTest(MyController.class)
public class ControllerTest {

    @Autowired
    MockMvc mockMvc;

    @MockBean
    CompanyService companyService;


    @Test
    void getEmployeeListTest() throws Exception{
        when(companyService.getEmployeeList()).thenReturn(new ArrayList<>());
        mockMvc.perform(get("/employeeList"))
                .andExpect(status().isOk())
                .andDo(print());
    }
    
   
   				
                .
                .
                .

위처럼 Mocking을 한다면 정상적으로 실행이된다.

 

 

여기서 WebMvcTest는 단위테스트라는 것을 기억하자. 만약 컨트롤러를 통해 실제 응답값을 확인해서 테스트를 진행하고자 한다면 그것은 단위테스트가 아니라 통합테스트다. 그럴때는 @SpringBootTest를 이용해서 통합테스트를 진행하자(@SpringBootTest는 애플리케이션내의 모든 Spring Bean을 가져온다.)

 

'Spring' 카테고리의 다른 글

Spring Jpa 테스트 H2, TestEntityManager  (0) 2022.01.20
Spring Lifecycle Callback  (0) 2021.03.20
Spring 단위테스트 -2 Data  (0) 2021.02.28
Spring 단위테스트 - 1  (0) 2021.02.28
InMemory-H2  (0) 2021.02.23