TDD란 무엇인가? 를 떠나서 스프링 프로젝트에서 TDD를 어떻게 진행하는지에 대한 정리.
여러 스타일 중 한가지
- TDD는 기본적으로 테스트 코드를 빌드업 해가면서 개발함. 즉, 이미 한참 완성된 코드를 테스트 하는건 TDD의 방향이 아님. 이런 경우는 있을까?
서비스 로직
- 서비스 로직을 먼저 POJO로 만든다. 테스트 할 로직을 우선으로 만들면서 서비스 클래스, 엔티티, 영속성 클래스를 만든다.
- 서비스 로직에서 필요한 메서드, 클래스 등은 이너클래스로 먼저 개발 한 뒤 테스트가 완료되면 IDE를 통해 리팩토링 기능으로 꺼낸다. (IntelliJ → Move Inner tp Upper Level)
- 클래스를 옮긴 후 부터는 스프링 통합테스트에 붙여
@Autowired
가 가능해짐.
엔티티와 영속성
- 엔티티로 잡을 클래스는 인메모리로 먼저 setter, getter 코딩해서 Map에다 담은 후에 기본 테스트가 완료되면 JPA Repository를 붙인다.
- JPA로 스프링부트 통합 테스트를 하는 경우 매 테스트마다 프록시 상태 초기화를 위해
InitializingBean
을 구현한 별도의 클래스를@BeforeEach
메소드를 작성하여EntityManager
로flush()
해야함. (예: ID 시퀀스 초기화)
API 테스트
- 기본적으로 스프링 통합 테스트
- REST API 테스트는
io.restassured.RestAssured
로 한다. 메소드 체이닝을 통해 given, when, then 식으로 검증 가능.
통합 테스트
- 엔티티나 API 테스트엔 스프링 통합 테스트가 필요없지만, 서비스 코드는 테스트 코드 완성단계에선 필요함.