인프런 커뮤니티 질문&답변

chopinballadeno4님의 프로필 이미지
chopinballadeno4

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

키워드 정리

mockMVC CRUD작업

작성

·

202

0

controller테스트를 할때 mockMVC를 사용하면 DB에 CRUD 작업은 수행되지 않나요?

디버깅을 해보면 각 Layer별로 동작이 수행되는거 같은데 DB접근하여 데이터를 가져오는 부분에서는 null이 계속 나오네요(MyBatis 사용중).

또 만약 실제 프로덕션 controller처럼 모든 동작이 수행된다면 왜 "하위 Layer를 모두 mocking처리" 라고 표현하시는지 궁금합니다.

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, chopinballadeno4 님! :)

엇 아닙니다. MockMvc를 사용하고, 서비스 레이어를 제대로 mocking (강의 중에는 ControllerTestSupport 추상 클래스에 Service @MockBean 처리) 했다면, 실제 DB 레이어까지는 도달하지 않습니다.
실제로 강의 코드에 디버거를 걸어놓고 보면 프로덕션 서비스 로직이 수행되는 것이 아니라, 임의의 값(null 등)이 반환되거나 하여 mocking이 이루어진 것을 확인할 수 있습니다.

다시 한번 꼼꼼하게 디버깅 해보시는 걸 추천 드려요. ㅎㅎ

감사합니다. :)

0

안녕하세요, 인프런 AI 인턴입니다.

MockMvc를 사용하여 controller 테스트를 할 때, 실제 데이터베이스에 대한 CRUD 작업은 수행되지 않습니다. 이는 MockMvc가 웹 서버를 실제로 실행하지는 않지만, Spring MVC의 동작을 모사하여 DispatcherServlet까지의 요청-응답 흐름을 테스트하는 것이기 때문입니다.

@WebMvcTest 어노테이션을 사용하면 Spring MVC 인프라는 자동 설정되지만, 컨트롤러 빈과 관련된 빈들만 스캔되고 정규 @Component@ConfigurationProperties 빈은 스캔되지 않습니다. 따라서, 실제 비즈니스 로직과 데이터베이스 액세스를 담당하는 서비스, 리포지토리 계층은 MockBean을 사용하여 목(mock) 객체로 대체되어야 하며, 이 목 객체는 테스트 케이스에 따라 동작을 정의할 수 있습니다.

‘하위 Layer를 모두 mocking처리’라고 표현하는 이유는 실제 데이터베이스나 외부 서비스에 대한 의존성을 제거하고 테스트의 격리성을 높이기 위해 목 객체를 사용하여 하위 계층의 구체적인 구현 대신 테스트에 필요한 동작만을 정의하기 때문입니다. 그 결과, 테스트는 더 빠르고, 일관되며, 예측 가능해집니다.

테스트 중 DB 접근으로 데이터를 가져오는 부분에서 null이 반환되는 것은 실제 데이터베이스가 아닌 목 객체를 사용하기 때문에 발생하는 현상입니다. 테스트 시에 목 객체에 대해 기대되는 동작(예: 특정 메서드 호출에 대한 반환값)을 정의해야 합니다.

더 자세한 내용은 Spring Boot Reference Documentation의 “Auto-configured Spring MVC Tests” 부분을 참조하시면 도움이 될 것입니다.

chopinballadeno4님의 프로필 이미지
chopinballadeno4

작성한 질문수

질문하기