Programming/For interview

[Spring] Mock 테스트

LazyCat 2024. 12. 4. 20:52
반응형

🤍소프트웨어 테스트

1. TDD (Test-driven development)

개발 전 테스트 코드를 먼저 작성하는 방식을 의미한다.

 

2. 왜 TDD를 사용해야 할까?

테스트를 잘 작성하기 위해선,  모든 요구 사항에 대한 철저한 점검이 필요하기 떄문이다!

  • 시스템 전반적인 설계 향상
  • 개발 집중력 향상

3. 테스트 종류

테스트 종류 범위  대상 속도 도구/기법
단위 테스트 작은 단위(메소드, 클래스) 개별 로직 빠름 JUnit, Mockito 
통합 테스트 모듈 간 상호작용 여러 모듈(컨트롤러 - 서비스 등) 보통 Spring Boot Test
시스템 테스트 애플리케이션 전체 애플리케이션 전체 느림  

 

1. 단위테스트(Unit Test)

  • 개별 메소드, 클래스 등 작은 단위가 예상대로 동작하는지 검증
  • 가장 작은 테스트 단위
  • Mock 객체를 활용해 외부 의존성을 제거

2. 통합테스트(Integration Test)

  • 여러 모듈이 함께 통합될 때 올바르게 작동하는지 확인
  • 모듈간 상호작용 검증
  • 데이터베이스, 외부 API와의 통신
  • 컨트롤러와 서비스 게층이 올바르게 통신하는지 테스트
  • 데이터베이스 쿼리가 제대로 작동하는지 확인

3. 시스템 테스트

  • 전체 애플리케이션이 사용자 요구사항에 맞게 동작하는지 확인
  • 실제 환경과 동일한 상태에서 테스트

 

 

🤍Mock 테스트란?

Mock 테스트는 테스트 환경에서 의존성 객체를 대체하기 위해 가짜(Mock)객체를 사용하는 방법이다.

 

Mock: 테스트 중 실제 객체를 대신하여 동작하는 가짜 객체

  • Mock 객체는 실제 로직 실행을 생략하고, 우리가 설정한 미리 정의된 동작을 수행.
  • 테스트 대상 객체의 외부 의존성을 제거하고 독립적으로 테스트할 수 있도록 도와줌.
  • 보통 단위테스트와 잘 어울린다.

 

 

 

🤍Mock 테스트에서 자주 사용하는 라이브러리

1. Mockito

  • Java에서 가장 널리 쓰이는 Mock 라이브러리.
  • Mock 객체 생성과 동작 정의를 간단하게 처리.

2. MockMvc

  • Spring Framework에서 제공.
  • 컨트롤러 레이어 테스트에 사용하며, HTTP 요청/응답을 시뮬레이

 

 

 

🤍테스트 구조

1. Given - 준비 단계

테스트를 실행하기 전에 필요한 초기 조건이나 입력 값을 설정하는 단계

  • 테스트의 초기 상태를 정의
  • Mock 객체를 생성하거나, 테스트 환경을 초기화

 

2. When - 실행 단계

테스트에서 검증할 행동(로직 실행)을 실행하는 단계

  • 실제로 테스트 대상 메서드 또는 API를 호출
  • 이 단계에서 테스트의 핵심 로직이 수행

 

3. Then - 검증 단계

테스트 실행 결과가 예상한 결과와 일치하는지 확인하는 단계

  • 반환된 값, 상태 코드, 예외 발생 여부 등을 검증
  • assert나 andExpect와 같은 메서드를 사용해 결과를 확인

예시 코드

@Test
@DisplayName("OAuth 리다이렉트 URL 반환 테스트")
void testOAuthRedirect() throws Exception {

    // Given: 초기 조건 설정
    String platform = "naver";
    String redirectUrl = "https://nid.naver.com/oauth2.0/authorize";
    Mockito.when(oAuthService.getRedirectUri(platform)).thenReturn(redirectUrl);

    // When: 테스트 실행
    mockMvc.perform(get("/oauth/" + platform)
            .contentType(MediaType.APPLICATION_JSON))
            // Then: 결과 검증
            .andExpect(status().isOk())
            .andExpect(content().string(redirectUrl));
}

 

반응형