스프링 테스트 코드 @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 |