[ Spring에서의 TDD(Test-Driven Development, 테스트 주도 개발) 프로그래밍 방법 ]
- Repository -> Service -> Controller 순서로 개발을 진행한다.
- Repository 계층의 테스트는 H2와 같은 인메모리 데이터베이스 기반의 통합 테스트로 진행한다.
- Service 계층의 테스트는 Mockito를 사용해 Repository 계층을 Mock하여 진행한다.
- Controller 계층의 테스트는 SpringTest의 MockMvc를 사용해 진행한다.
다른 예제나 강의들을 보면 Controller -> Service -> Repository 순서로 TDD 개발을 하는 경우도 많이 있다. 하지만 개인적인 경험을 바탕으로 Repository부터 계층을 작성해야 TDD의 flow가 매끄럽게 진행이 되는 것 같다. 왜냐하면 Repository 계층은 다른 계층에 대한 의존성이 거의 없기 때문에 먼저 작성하기가 편리하기 때문이다. Service 계층은 Repository에 의존하기 때문에 Repository가 있어야 개발이 편리하며 흐름이 끊기지 않고, Controller 계층은 마찬가지로 Service계층에 의존하기 때문이다.
반대로 Controller부터 개발을 진행하면 Controller를 작성하다가 Service를 작성하고 그러다가 Repository 까지 내려가서 흐름이 끊길 수 있기 때문이다. 만약 Controller부터 하는게 편하다면 Controller부터 개발해도 전혀 문제가 없다. 개인에 맞게 맞춰나가면 된다.
하지만 이러한 내용을 숙지했다고 하더라도 실제로 TDD를 적용하는 것은 쉽지 않다. 그러므로 요구사항이 주어진 과제를 테스트에 의해 주도되는 방법으로 실제 개발을 진행해보고자 한다. 단순히 TDD로 개발을 하는 것 뿐만 아니라 실무에 적용할만한 알짜 지식들 또는 팁 등도 작성해보고자 한다. 많은 사람들에게 도움이 되기를 바라면서 주어진 과제를 분석하고, TDD 기반으로 개발해보도록 하자.
(만약 단위 테스트에 대한 개념이나 Java에서 단위 테스트의 작성 또는 Spring에서의 단위 테스트 작성 및 Mockito 사용법에 대한 공부가 부족하다면 여기를 참고해주세요!)
1. Mockito란?
Mock 객체를 쉽게 만들고, 관리하고, 검증할 수 있는 방법을 제공하는 프레임워크
1.1. 용어 정리
1.1.1. Mock
- 진짜 객체와 비슷하지만 물리적으로 같지 않고 프로그래머가 직접 행동을 관리하는 객체이다.
- Mock은 모든 상호작용을 기억한다. 사용자는 Mock의 어떤 메서드가 실행되었는지 선택적으로 검증할 수 있다.
1.1.2. Stubbing
- 테스트 코드에서 Mock 객체를 사용할 때, Mock의 특정 메서드 호출과 응답을 정의하는 것을 말한다.
테스트를 작성하는 자바 개발자의 약 45%(JetBrains 설문조사)가 Mockito Framework를 사용한다. Mockito를 대체할 수 있는 테스트 프레임워크는 EasyMock, JMock 등이 있다.
2. 왜 사용하는가?
애플리케이션에서 구현되지 않은 객체 또는 메서드를 테스트 하려고 할 때, 해당 클래스가 어떻게 동작하는지 항상 미리 생각하고 계산하며 테스트를 작성한다면 매우 불편할 것이다.
이럴때 미리 Mock 객체를 생성해서 사용하면 조금 더 편하게 테스트를 할 수 있다.
ex) Member 또는 MemberDao가 어떻게 작동하는지 Mockito를 이용해 만들어 놓으면 Member와 MemberDao 객체를 구현하기 전에도 테스트를 작성할 수 있다.
아직도 감이 잘 안올 것이다. 아래에서 코드와 함께 보면서 사용법과 개념을 익혀보자.
이미 구현된 객체와 메서드를 Mocking할 필요가 있을까?
굳이 그럴 필요는 없다. 하지만 개발자가 컨트롤하기 힘든 부분이나 아직 구현되지 않은 클래스는 모킹이 필요한 경우가 많다.
참조
https://mangkyu.tistory.com/182
[TDD] 단위 테스트와 TDD(테스트 주도 개발) 프로그래밍 방법 소개 - (1/5)
이번에는 여러 개발 서적들 및 실무 경험 그리고 시행 착오 등을 겪으면서 얻은 테스트 주도 개발 방법에 대해 소개해보고자 합니다. 이번 포스팅에서는 먼저 단위 테스트와 중요성 그리고 단위
mangkyu.tistory.com
https://developer-nyong.tistory.com/33
[Test] Mockito 사용법
이번 글에서는 Mockito에 관련해서 글을 써보려 합니다. Spring이 적용된 Mockito가 아닌 JUnit으로만 사용할 수 있는 수준의 문법을 정리합니다. Mockito Test Framwork가 처음 사용하는 분들에게 불친절하다
developer-nyong.tistory.com