Spring Boot (6) 테스트 코드

넙데데맨·2022년 7월 26일
0
post-custom-banner

Gson

구글에서 개발한 JSON 파싱 라이브러리

객체 <-> JSON 문자열

서로 변환 시켜주는 역할

서비스 레이어 테스트

package com.springboot.test.service.impl;

import com.springboot.test.data.dao.dto.ProductResponseDto;
import com.springboot.test.data.entity.Product;
import com.springboot.test.data.repository.ProductRepository;
import com.springboot.test.data.service.impl.ProductServiceImpl;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import java.util.Optional;

import static org.mockito.Mockito.verify;

public class ProductServiceTest {
    private ProductRepository productRepository = Mockito.mock(ProductRepository.class);
    private ProductServiceImpl productService;

    @BeforeEach
    public void setUpTest(){
        productService = new ProductServiceImpl(productRepository);
    } // 초기화

    @Test
    void getProductTest(){
        Product givenProduct = new Product();
        givenProduct.setNumber(123L);
        givenProduct.setName("펜");
        givenProduct.setPrice(1000);
        givenProduct.setStock(1234);  // Given

        Mockito.when(productRepository.findById(123L)).thenReturn(Optional.of(givenProduct));

        ProductResponseDto productResponseDto = productService.getProduct(123L); // 동작 테스트

        Assertions.assertEquals(productResponseDto.getNumber(),givenProduct.getNumber());
        Assertions.assertEquals(productResponseDto.getName(),givenProduct.getName());
        Assertions.assertEquals(productResponseDto.getPrice(),givenProduct.getPrice());
        Assertions.assertEquals(productResponseDto.getStock(),givenProduct.getStock());

        verify(productRepository).findById(123L);
    }
}

단위 테스트를 위해 외부요인을 배제한다.
Mockito.mock() 메소드 사용해 ProductRepository 주입 후 초기화해준다.
Given-When-Then 패턴을 기반
테스트에 사용할 Product 엔티티 객체 생성
Mockito.when() 객체의 행동 설정
.thenReturn() 메소드를 실제 호출하며 리턴값 설정
any 특정 매개변수 전달을 설정하지 않고 메소드 실행만 확인
Assertions.assertEquals JUnit 메소드로 두 값이 일치하는 지 확인

리포지토리 객체 테스트

DB와 가장 가까운 레이어로 기본적인 쿼리 메소드를 사용할 수 있다.

주의점

  1. 기본적인 메소드(save(), findbyId() 등등...)의 테스트는 의미가 없다.
  2. DB를 연결할 지 테스트 DB를 쓸지 사용 안할지에 대한 고민

어노테이션

@DataJpaTest
JPA 관련 설정만 로드해서 테스트 진행
테스트 코드가 종료될 시 자동으로 DB 롤백(@Tranactional 포함)
기본적으로 임베디드 DB 사용

Jacoco

Java Code Coverage
JUnit 테스트를 통해 코드가 얼마나 테스트 됐는지 Line과 Branch 기준으로 한 커버리지로 리포트하며 HTML, XML, CSV 같은 다양한 형식으로 리포트를 확인할 수 있다.

코드 커버리지

'코드 자체가 얼마나 실행되었느냐'를 수치로 확인할 수 있는 테스트 수준 확인 지표

따로 알게된 점
Lombok의 @Builder 어노테이션

  • Builder 패턴을 사용해 필수 인자와 선택적 인자를 위한 생성자를 만들어준다.
profile
차근차근
post-custom-banner

0개의 댓글