Backend
home
🏊🏻‍♂️

[실습-테스트코드] Repository Test

생성 일시
2025/02/20 13:59
태그
SpringBoot
게시일
최종 편집 일시
2025/02/27 10:56

실습 내용 정리

Persistence Layer 테스트 실습 관련 학습내용에 대해 정리한다.

엔티티

package sample.cafekiosk.spring.domain.product; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import sample.cafekiosk.spring.domain.BaseEntity; @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Product extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String productNumber; @Enumerated(EnumType.STRING) private ProductType type; @Enumerated(EnumType.STRING) private ProductSellingStatus sellingStatus; private String name; private int price; // Test 위한 생성자 @Builder public Product(String productNumber, ProductType type, ProductSellingStatus sellingStatus, String name, int price) { this.productNumber = productNumber; this.type = type; this.sellingStatus = sellingStatus; this.name = name; this.price = price; } }
Java
복사

Repository

package sample.cafekiosk.spring.domain.product; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface ProductRepository extends JpaRepository<Product, Long> { /** * select * * from product * where selling_status in ('SELLING', 'HOLD'); */ List<Product> findAllBySellingStatusIn(List<ProductSellingStatus> sellingStatuses); }
Java
복사

Repository Test

package sample.cafekiosk.spring.domain.product; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; import static org.junit.jupiter.api.Assertions.*; import static sample.cafekiosk.spring.domain.product.ProductSellingStatus.HOLD; import static sample.cafekiosk.spring.domain.product.ProductSellingStatus.SELLING; import static sample.cafekiosk.spring.domain.product.ProductSellingStatus.STOP_SELLING; import static sample.cafekiosk.spring.domain.product.ProductType.HANDMADE; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; //@SpringBootTest @ActiveProfiles("test") @DataJpaTest // @SpringBootTest 보다 가벼움 class ProductRepositoryTest { @Autowired private ProductRepository productRepository; @DisplayName("원하는 판매상태를 가진 상품들을 조회한다.") @Test public void findAllBySellingStatusIn() { // given (사전 준비) Product product1 = Product.builder() .productNumber("001") .type(HANDMADE) .sellingStatus(SELLING) .name("아메리카노") .price(4000) .build(); Product product2 = Product.builder() .productNumber("002") .type(HANDMADE) .sellingStatus(HOLD) .name("카페라떼") .price(4500) .build(); Product product3 = Product.builder() .productNumber("003") .type(HANDMADE) .sellingStatus(STOP_SELLING) .name("팥빙수") .price(7000) .build(); productRepository.saveAll(List.of(product1, product2, product3)); // when (테스트 진행할 행위) List<Product> products = productRepository.findAllBySellingStatusIn( List.of(SELLING, HOLD)); // then (행위에 대한 결과 검증) assertThat(products).hasSize(2) .extracting("productNumber", "name", "sellingStatus") // 검증하고자 하는 필드만 추출 .containsExactlyInAnyOrder( // 순서 상관없이 검증 tuple("001", "아메리카노", SELLING), tuple("002", "카페라떼", HOLD) ); } }
Java
복사
extracting
검증하고자 하는 필드만 추출해준다.
containsExactlyInAnyOrder
순서에 상관없이 검증 과정을 진행한다.
@ActiveProfiles("test"):
application.yml 에 설정한 on-profile의 test 정보를 참조하여 테스트를 진행하도록 한다.

application.yml

spring: profiles: default: local datasource: url: jdbc:h2:mem:~/cafeKioskApplication driver-class-name: org.h2.Driver username: sa password: jpa: hibernate: ddl-auto: none --- spring: config: activate: on-profile: local jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true defer-datasource-initialization: true # (2.5~) Hibernate 초기화 이후 data.sql 실행 h2: console: enabled: true --- spring: config: activate: on-profile: test jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true sql: init: mode: never
YAML
복사