Skip to content

[pg.531] Ch.12 테스트코드 자율과제  #7

@zakard114

Description

@zakard114

본문에서 커버한 productAddTest() 외의 나머지 메서드들에 대한 테스트코드들을 아래와 같이 작성후 모든 검증을 완료하였습니다. 개선사항이나 좋은 의견 또는 조언을 환영합니다.

`package com.heeju.product_management.application;

import com.heeju.product_management.domain.Product;
import com.heeju.product_management.domain.ProductRepository;
import com.heeju.product_management.presentation.ProductDto;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static org.mockito.Mockito.;
import static org.junit.jupiter.api.Assertions.
;

@ExtendWith(MockitoExtension.class)
public class SimpleProductServiceUnitTest {

@Mock
private ProductRepository productRepository;
@Mock
private ValidationService validationService;
@InjectMocks
private SimpleProductService simpleProductService;

@Test
@DisplayName("After adding a product, the added product must be returned in process")
void productAddTest(){
    // Given
    ProductDto productDto = new ProductDto("pencil", 300, 20);
    Long PRODUCT_ID = 1L;
    Product product = ProductDto.toEntity(productDto);
    product.setId(PRODUCT_ID);
    when(productRepository.add(any())).thenReturn(product);
    // When
    ProductDto savedProductDto = simpleProductService.add(productDto);
    // Then
    assertTrue(savedProductDto.getId().equals(PRODUCT_ID));
    assertTrue(savedProductDto.getName().equals(productDto.getName()));
    assertTrue(savedProductDto.getPrice().equals(productDto.getPrice()));
    assertTrue(savedProductDto.getAmount().equals(productDto.getAmount()));
}

@Test
@DisplayName("FindByIdTest, product must be returned in process")
void findByIdTest(){
    // Given
    ProductDto productDto = new ProductDto(1L,"eraser", 200, 30);
    Long PRODUCT_ID = 1L;
    Product product = ProductDto.toEntity(productDto);
    when(productRepository.findById(PRODUCT_ID)).thenReturn(product);
    // When
    ProductDto savedProductDto = simpleProductService.findById(PRODUCT_ID);
    // Then
    assertTrue(savedProductDto.getId().equals(PRODUCT_ID));
    assertTrue(savedProductDto.getName().equals(productDto.getName()));
    assertTrue(savedProductDto.getPrice().equals(productDto.getPrice()));
    assertTrue(savedProductDto.getAmount().equals(productDto.getAmount()));
}

@Test
@DisplayName("FindAll test, products must be returned in process")
void findAllTest(){
    // Given
    List<Product> products = new ArrayList<>();
    products.add(new Product(1L, "pencil", 200, 10));
    products.add(new Product(2L, "eraser", 300, 20));
    products.add(new Product(3L, "note", 400, 30));
    when(productRepository.findAll()).thenReturn(products);
    // When
    List<ProductDto> productDtos = simpleProductService.findAll();
    // Then
    assertEquals(products.size(), productDtos.size(), "both size should be equal");
    for (int i = 0; i < products.size(); i++) {
        Product expectedProduct = products.get(i);
        ProductDto expectedProductDto = productDtos.get(i);
        assertEquals(expectedProduct.getId(), expectedProductDto.getId(), "Ids should be equal");
        assertEquals(expectedProduct.getName(), expectedProductDto.getName(),"Names should be equal");
        assertEquals(expectedProduct.getPrice(), expectedProductDto.getPrice(),"Prices should be equal");
        assertEquals(expectedProduct.getAmount(), expectedProductDto.getAmount(),"Amounts should be equal");
    }
}

@Test
@DisplayName("FindByNameContaining test, product must be returned in process")
void findByNameContaining(){
    // Given
    List<Product> products = new ArrayList<>();
    String name = "pen";
    products.add(new Product(1L, "pencil", 200, 10));
    products.add(new Product(2L, "eraser", 300, 20));
    products.add(new Product(3L, "pen", 400, 30));
    products.add(new Product(4L, "note", 500, 40));

    List<Product> filteredByNameProducts = products.stream()
            .filter(product -> product.containsName(name))
            .collect(Collectors.toList());

    when(productRepository.findByNameContaining(any())).thenReturn(filteredByNameProducts);

    // When
    List<ProductDto> filteredByNameProductDtos = simpleProductService.findByNameContaining(name);

    // Then
    for (int i = 0; i < filteredByNameProductDtos.size(); i++) {
        Product expectedProduct= filteredByNameProducts.get(i);
        ProductDto expectedProductDto = filteredByNameProductDtos.get(i);

        assertEquals(expectedProduct.getName(), expectedProductDto.getName(),"Names should be equal");
    }
}

@Test
@DisplayName("Update test, product must be returned in process")
void update(){
    // Given
    Product originalProduct = new Product(1L, "pencil", 200, 10);
    ProductDto productDto = new ProductDto(1L, "pencil", 500, 40);
    Product product = ProductDto.toEntity(productDto);

    if(product.getId().equals(originalProduct.getId())) originalProduct = product;
    when(productRepository.update(product)).thenReturn(originalProduct);

    // When
    ProductDto updatedProductDto = simpleProductService.update(productDto);

    // Then
    assertTrue(updatedProductDto.getId().equals(product.getId()));
    assertTrue(updatedProductDto.getName().equals(product.getName()));
    assertTrue(updatedProductDto.getPrice().equals(product.getPrice()));
    assertTrue(updatedProductDto.getAmount().equals(product.getAmount()));
}

@Test
@DisplayName("Delete test")
void deleteTest(){
    Long id = 1L;
    simpleProductService.delete(id);
}

}`

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions