• TDD(테스트 주도 개발)
    • 테스트의 중요성을 강조한 개발방법론으로서 테스트코드를 먼저 설계 및 개발하고, 그 이후에 개발을 해 나가는 것
    • 테스트 코드를 먼저 작성함으로써 개발자는 원하는 기능과 그 기능의 동작 방식에 대해 더욱 명확하게 이해할수 있고, 결함의 조기발견을 통해 장기적 효율성 증대
  • JUNIT이 spring에서 가장 많이 사용되는 라이브러리
  • 테스트 방법
    • 단위테스트
      • 단위 테스트는 애플리케이션의 가장 작은 단위(메소드, 클래스)를 테스트
      • Controller 테스트
        • @WebMvcTest 어노테이션을 사용. 이는 Spring MVC 컨트롤러를 테스트하는 데에 최적화되어 있으며, 관련 빈들만 로드
          • 단, mvc외의 의존성이 있을경우 에러 발생
        • 목킹(Mocking)을 사용하여 외부 의존성을 가상화
          • mock이란 실제 객체를 모방하는 가짜 객체로, 주로 단위 테스트에서 실제 구현을 대체하기 위해 사용
            • 이를 통해 격리된 테스트 가능
          • MockMvc는 Spring MVC 컨트롤러를 테스트하기 위해 HTTP 요청을 모의로 보내고, 응답을 검증
      • Service 테스트
        • @MockBean으로 필요한 의존성을 목킹하여 격리된 환경에서 테스트
      • Repository 테스트
        • @DataJpaTest는 JPA 관련 설정만 로드
        • @SpringbootTest 어노테이션 사용시 전체 설정 로드
    • 통합테스트
      • 통합 테스트는 애플리케이션의 여러 컴포넌트나 전체 시스템이 올바르게 작동하는지 확인
      • @SpringBootTest 어노테이션을 사용
      • 각각의 메서드에 대해서 각각 실행 가능, 전체 클래스 단위로 실행도 가능
        • 전체 클래스 단위로 테스트 할때는 메서드 간 의존성 제거 필요
        • AfterEach 어노테이션 사용하여 추가된 data삭제와 같은 의존성 제거 작업 필요
          • DataJpaTest의 경우 자동 DB롤백기능 수행
    • 주요패턴
      • given, when, then(준비-prepare,실행-excute,검증-assert) 패턴을 많이 사용
        • 예시상황) Given (준비) : 사용자의 은행 계좌에 1,000달러가 있다. When (실행) : 500달러 인출코드 실행 Then (검증) : 사용자의 계좌 잔액은 500달러가 됐는지 검증
        • 예시 코드) //Given account = new BankAccount(1000) // When account.withdraw(500) // Then assert account.balance == 500