베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Programming/[Spring Boot]

서비스 테스트 코드 작성

2023. 3. 16. 10:25

getProduct() 테스트 코드

package com.springboot.test.service.impl;

import com.springboot.test.data.dto.ProductResponseDTO;
import com.springboot.test.data.entity.Product;
import com.springboot.test.data.repository.ProductRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.mockito.Mockito.verify;

import java.util.Optional;

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);

        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);
    }
}

getProcut() 테스트 코드 설명

아래 코드는 Mockito mock 메서드를 통해 ProductRepository를 주입받는 코드이다.

private ProductRepository productRepository = Mockito.mock(ProductRepository.class);

위에서 정의한 productRepository를 기반으로 매 테스트 전 productService 객체를 초기화한다.

@BeforeEach
public void setUpTest() {
    productService = new ProductServiceImpl(productRepository);
}

productRepository.findById(123L)이 호출되면 givenProduct를 Return하라는 코드이다.

Optional.of() 메서드는 null이 아닌 값을 가지는 Optional 객체를 반환하는 메서드이다.

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

이후 productService를 통해서 데이터를 가져온 뒤, 최초에 정의한 데이터와 일치하는지 검증한다.

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);

saveProduct() 테스트 코드

package com.springboot.test.service.impl;

import com.springboot.test.data.dto.ProductDTO;
import com.springboot.test.data.dto.ProductResponseDTO;
import com.springboot.test.data.entity.Product;
import com.springboot.test.data.repository.ProductRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.Mockito.verify;

import java.util.Optional;

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

    @BeforeEach
    public void setUpTest() {
        productService = new ProductServiceImpl(productRepository);
    }

    @Test
    void saveProductTest() {
        Mockito.when(productRepository.save(any(Product.class)))
                .then(returnsFirstArg());

        ProductResponseDTO productResponseDTO = productService.saveProduct(new ProductDTO("펜", 1000, 1234));

        Assertions.assertEquals(productResponseDTO.getName(), "펜");
        Assertions.assertEquals(productResponseDTO.getPrice(), 1000);
        Assertions.assertEquals(productResponseDTO.getStock(), 1234);

        verify(productRepository).save(any());
    }
}

saveProduct() 테스트 코드 설명

productRepository.save()를 호출하면

returnsFirstArg() 를 리턴한다고 정의하는 코드이다.

Mockito.when(productRepository.save(any(Product.class)))
        .then(returnsFirstArg());

any() 는 특정 매개변수의 전달을 설정하지 않고 메서드의 실행만 확인할 때 쓴다.



Uploaded by N2T

'Programming > [Spring Boot]' 카테고리의 다른 글

컨트롤러 테스트 코드 작성  (0) 2023.03.16
Gson  (0) 2023.03.16
리포지토리 테스트 코드 작성  (0) 2023.03.16
JPA save vs saveAndFlush  (0) 2023.03.16
Entity 관련 Annotation  (0) 2023.03.12
    'Programming/[Spring Boot]' 카테고리의 다른 글
    • 컨트롤러 테스트 코드 작성
    • Gson
    • 리포지토리 테스트 코드 작성
    • JPA save vs saveAndFlush
    베오
    베오

    티스토리툴바