본문 바로가기
자바

스프링 테스트 코드 @RestControllerAdvice를 거치게 하는 방법

by Hyeongjun_Ham 2024. 1. 25.

스프링 테스트 코드 @RestControllerAdvice를 거치게 하는 방법

 

스프링에서 컨트롤러 테스트 코드 작성 시

@RestControllerAdvice를 거치지 않아서 Exception 처리가 통과 안 한 경우가 있었다.

 

@RestControllerAdvice를 거치도록 하는 방법은 두 가지를 찾았다.

 

@MockBean을 사용해서 서비스를 등록할 때, @Mock을 사용해서 서비스를 등록할 때를 나눠서 살펴보자.

 


1. @MockBean을 사용한 경우

 

첫 번째 방법은 서비스를 @MockBean으로 등록하는 방법이다.

 

@WebMvcTest(TestController.class)
class TestControllerTest {

    @Autowired
    MockMvc mockMvc;

    @MockBean
    SampleService sampleService;

    @Test
    void exceptionTest(){
    
    // exception test 로직
    
    }

}

 

아주 간단하게 표시해 봤다.

 

여러 개를 테스트하는 경우 아래와 같이 mockBean을 리셋시키면 된다.

 @BeforeEach
    public void setup() {
        Mockito.reset(sampleService);
    }

 

두 번째 방법까지 알아보고 정리해 보자.


 

2. @Mock을 사용한 경우 MockMvcBuilders 사용

@WebMvcTest(TestController.class)
class TestControllerTest {

    @InjectMocks
    TestController testController

    @Autowired
    MockMvc mockMvc;

    @Mock
    SampleService sampleService;
    
    @BeforeEach
    public void setup(){
    mockMvc = MockMvcBuilders.standaloneSetup(testController)
                .setControllerAdvice(AdviceController.class) // @RestControllerAdvice 등록된 부분
                .build();
    }

    @Test
    void exceptionTest(){
    
    // exception test 로직
    
    }

}

 

SampleService를 @Mock으로 처리하고 mockMvc에. setControllerAdvice()로 @RestControllerAdvice 등록된 클래스를 등록하는 방법이다.

 


 

- 테스트하며 느낀 것(?), 알아낸 것은 다음과 같다.

  • @RestControllerAdvice 클래스가 빈으로 등록되어 있고 @MockBean으로 등록한 서비스도 빈으로 작동하는 것처럼 보인다. 그래서 exception 던지는 경우 @RestControllerAdvice가 잡아낼 수 있는 것 같다.
  • @Mock으로 등록한 서비스는 스프링의 빈에서 exception을 던지는 것이 아니기에 @RestControllerAdvice가 잡아낼 수 없는 것으로 보인다.
  • 그래서 mockMvc에 .setControllerAdvice()로 직접 @RestControllerAdvice 클래스를 등록해야 한다.

 

둘 다 서비스에서 exception을 던졌을 때 @RestControllerAdvice 에서 잡아내는 것을 볼 수 있었다.

'자바' 카테고리의 다른 글

[스프링] .properties 에 값이 없는 경우 @Value 기본 값 설정  (0) 2024.02.19
[JDBC] DB PK변경 방법  (0) 2024.02.07
자바 Atomic 패키지  (2) 2024.01.24
JVM (Java Virtual Machine)  (0) 2024.01.18
자바(JAVA) - synchronized 란?  (0) 2024.01.16