Spring/테스트

Service 테스트

초코chip 2024. 3. 11. 18:11

개념

Service 테스트를 진행할 때, Mockito 프레임워크를 활용해서 진행

  • 정의: Junit에서 가짜 객체인 Mock객체를 생성해주고, 관리 및 검증을 지원하는 프레임워크
  • Mock 정의: 테스트 대상 클래스에서 사용되는 외부 의존성(객체)에 대한 가짜

 

사용법

의존성

spring-boot-start-test에서 자동으로 Mockito를 추가해줌

testImplementation 'org.springframework.boot:spring-boot-starter-test'

 

 

테스트 코드 파일 생성

  1. 테스트 코드 파일을 만들고 싶은 Service 파일 열기
  2. 해당 service 이름에 마우스 커서를 올리고, <Ctrl + Shift + T> 눌러서 <Create New Test> 클릭
  3. 테스트 코드를 생성하고 싶은 메서드를 클릭하고 Ok 버튼을 누르면 테스크 코드 파일이 자동으로 생성 

 

 

초기 세팅

테스트 대상 클래스와 외부 의존성에 대한 객체를 생성해야한다

  • @Mock: 테스트 대상 클래스에서 사용되는 외부 의존성에 대한 가짜를 생성
  • @InjectMocks: 테스트 대상 클래스에 실제 의존성을 주입
Service 클래스 Service Test 클래스

 

참고) @InjectMocks는 아래와 동일하게 동작 

@BeforeEach
void setUp() {
    MockitoAnnotations.openMocks(this);
    biddingService = new BiddingService(biddingRepository, productRepository);
}

 

Mock 객체 동작 지정

테스트 대상 클래스 말고 외부 의존성으로 가져오는 Mock 객체는 모두 가짜이기에 별다른 기술 없이 동작 불가능

따라서, 테스트 케이스마다 사용되는 Mock 객체의 메서드의 동작 과정을 명시적으로 작성해야한다.

  • mock 객체의 특정 메서드(someMethod)가 반환해야할 값(expectedValue) 지정
    • when(mock.someMethod()).thenReturn(expectedValue)
    • given(mock.someMethod()).willReturn(expectedValue)

 

주의

그러면 테스트 메서드안의 모든 mock 메서드에 대한 행동 지정을 해야하는가? -> NO

오직, mock 메서드의 행동이 이후 코드에 영향을 줄 때만 사용

  • 리턴 타입 void 메서드: 리턴타입이 없는 메서드는 mock객체 행동 지정을 할 필요가 없음
    • 해당 메서드가 호출되었는지 호출 검증(verify)만 진행하면 됨

 

결과 검증

값 검증

  • 메서드의 실행 결과(반환 결과) 값이 기대한 값과 일치하는지 검증
  • Junit의 assertThat() 메서드 사용
@Test
public void testServiceMethod() {

    //기대 결과 설정
    String expected = "expected result";

    //서비스 메소드 실행
    String result = service.serviceMethod();

    //결과 검증
    assertThat(result).isEqualTo(expected);
}

 

호출 검증

  • 특정 메서드가 몇 번 호출되었는지를 검증
    • 특히 외부 의존성을 가진 메서드의 상호작용을 테스트할 때 유용
  • Mockito의 verify() 메서드 사용
@Test
public void testMethodInteraction() {
    service.callDependencyMethod();
    
    // 메서드 호출 검증
    verify(dependency).dependencyMethod();
    
    // 메서드가 정확히 한 번 호출되었는지 검증
    verify(dependency, times(1)).dependencyMethod();
    
    // 메서드가 호출되지 않았는지 검증
    verify(dependency, never()).anotherMethod();
}

 

예외 검증

  • 메서드가 특정 조건에서 예외를 올바르게 던지는지 검증
  • JUnit의 assertThrows() 메서드 사용
@Test
public void testException() {
    // 예외 검증
    assertThrows(특정예외.class, () -> service.methodThatThrowsException());
}

 

 

 

 

참고

https://pows.tistory.com/43

 

Mockito , MockMVC

Mockito 단위 테스트를 위한 Java Mocking Framework Junit에서 가짜 객체인 Mock객체를 생성해주고 관리하고 검증 할 수 있도록 지원해주는 Framework 구현체가 아직 없는 경우나 구현체가 있더라도 특정 단

pows.tistory.com

 

 

https://velog.io/@hellonayeon/spring-boot-service-layer-unit-testcode

 

[Spring Boot] Service 계층의 단위 테스트 코드 작성

 

velog.io

 

'Spring > 테스트' 카테고리의 다른 글

Service - 수정 테스트  (0) 2024.03.12
Service - 삭제 테스트  (0) 2024.03.12
Service - 조회 테스트  (0) 2024.03.12
Service - 생성 테스트  (0) 2024.03.11
Postman 파일 첨부 요청 방법  (0) 2024.02.07