Presentation Layer의 단위 테스트를 진행할 때
@WebMvcTest 를 이용해 컨트롤러와 관련된 Bean들만 띄워서 가볍게 단위 테스트를 진행할지
or
@SpringBootTest 를 이용해 Service 및 Repository Bean들도 같이 띄워서 통합테스를 진행하지 고민이 많이됬다.

@WebMvcTest 를 이용할 경우 andExpected 단계에서 Response의 Body가 담겨오지 않게된다.
(실 서비스를 실행하지않고 Mockit의 verify() 메서드를 이용해 서비스 메서드가 실행됬는지만 검증하기때문에)
서비스가 제대로 실행되고 응답값을 검증하고싶어 방법을 구글링했더니 Mockito.when()을 많이 사용하는거같아 테스트코드에 적용시켜봤다.


응답값은 잘 넘어는것을 확인했지만,
내가 직접 작성한 응답값이 넘어오기에 뭔가 찝찝한 상황
컨트롤러 단위테스트에서 응답값의 JSON까지 검증하는게 아닌건가 생각이 들어 이러한 경우를 더 찾아봤다.
- 직접 응답값을 작성하는 경우:
- 장점:
- 특정 상황에 대한 응답값을 정확하게 예측하고 테스트할 수 있다.
- 응답값이 특정 규칙에 따라 고정되어 있는 경우 테스트가 안정적이고 일관성 있게 수행한다.
- 단점:
- 실제 서비스에서 변경이 발생할 경우, 테스트 코드도 함께 업데이트되어야 한다.
- 특정 시나리오에 대한 테스트만을 수행하므로, 서비스 전반적인 동작을 확인하기 어려울 수 있다.
- 장점:
- 실 서비스에서 받은 응답값을 사용하는 경우:
- 장점:
- 실제 서비스와 동일한 응답값을 사용하므로 테스트가 현실적이고 믿을 수 있다
- 서비스의 변경에 영향을 덜 받는다.
- 단점:
- 서비스가 변경될 때마다 테스트가 실패할 수 있다.
- 응답값이 동적이거나 특정 규칙에 따라 달라질 경우 테스트가 불안정할 수 있다.
- 장점:
우선 내가 이번 고민에서 결론지은 방법은
@WebMvcTest 로 컨트롤러의 단위테스트만 진행해 외부의 요청에 컨트롤러가 정상적으로 작동하고있는지만 확인하기로했다.
이유:
컨트롤러 테스트에서 확인해야할것.
1. 컨트롤러가 해당 url을 잘 listen하고 있는지
2.요청값이 컨트롤러를 통해 제대로 직렬화가 되고있는지
3. @Valid 같은 유효성 검증이 이뤄지고있는지
4. 비지니스 로직 (service) 이 컨트롤러를 통해 불려졌는지
5. 응답 본문에 json 형태의 값이 유효하게 포함되는지
5번을 확인하려다 이 고민이 시작됬는데 json값이 유효하게 포함되는지 확인하기위해 when() 메서드를 사용해 응답값을 직접 작성해 넘겨줘야함을 알게됬다.
또 실 서비스단계에서 요청값이 DB에 잘 저장되고 읽어오기가 되는것은 Servcie 및 Repositroy 테스트에서 따로 검증하기로 결론.
'Project > TomorrowLand' 카테고리의 다른 글
Testable Code 작성을 위한 노력 1 (0) | 2024.01.11 |
---|---|
테스트 케이스를 작성하지말자. (0) | 2024.01.11 |
조회수 동시성문제 비관적 Lock을 선택한이유. (0) | 2024.01.08 |
Layer간 의존성 줄이기 - 1 - (0) | 2024.01.07 |
JWT를 이용한 로그인 기능 구현을하며 (0) | 2023.12.25 |