JPA | JPA Repository Layer Test

DoItDevΒ·2021λ…„ 5μ›” 23일
0
post-thumbnail

πŸ‘‚ λ“€μ–΄κ°€κΈ° μ•žμ„œμ„œ

이번 ν¬μŠ€νŒ…μ€ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±ν•˜λŠ” 방법을 ν•˜λ €κ³  ν•œλ‹€.
Test Case 의 μ€‘μš”μ„±μ€ ν—Œμ—…μ—μ„œ μš΄μ˜ν• λ•Œ λ°”λ‘œ κ°œλ°œν•œκ²ƒμ„ μ˜¬λ¦¬λŠ” 것은 μ•ˆμ’‹μ€ μŠ΅κ΄€μ΄λ‹€.
κ·Έλž˜μ„œ ν•„μžμ˜ 경우 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μ€‘μš”ν•˜λ‹€κ³  생각이든닀.

🧐 JPA Repository Layer Test Case

일단 JPA λ ˆνŒŒμ§€ν† λ¦¬μ—μ„œ 둜직 ν•˜λ‚˜λ₯Ό μΆ”κ°€λ₯Ό ν•΄μ€€λ‹€.

Repository Interface

@Repository
public interface CustomRepository extends JpaRepository<Custom, CustomPK> {
    Optional<List<Custom>> findByContentContaining(String content);
}

Test Class

@DataJpaTest: JPA ꡬ성 μš”μ†Œ μ—λ§Œ μ΄ˆμ μ„ 맞좘 JPA ν…ŒμŠ€νŠΈμ— λŒ€ν•œ μ£Όμ„μž…λ‹ˆλ‹€.
이 주석을 μ‚¬μš©ν•˜λ©΄ 전체 μžλ™ ꡬ성이 λΉ„ν™œμ„±ν™”λ˜κ³  λŒ€μ‹  JPA ν…ŒμŠ€νŠΈμ™€ κ΄€λ ¨λœ ꡬ성 만 μ μš©λ©λ‹ˆλ‹€.
기본적으둜 주석이 달린 ν…ŒμŠ€νŠΈ @DataJpaTestλŠ” νŠΈλžœμž­μ…˜μ΄λ©° 각 ν…ŒμŠ€νŠΈκ°€ 끝날 λ•Œ λ‘€λ°±λ©λ‹ˆλ‹€. λ˜ν•œ λ‚΄μž₯ 된 λ©”λͺ¨λ¦¬ λ‚΄ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€ (λͺ…μ‹œ 적 λ˜λŠ” 일반적으둜 μžλ™ κ΅¬μ„±λœ DataSource λŒ€μ²΄).

@ActiveProfiles: ActiveProfiles for ν…ŒμŠ€νŠΈ 클래슀λ₯Ό λ‘œλ“œ ν•  λ•Œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” ν™œμ„± Bean μ •μ˜ ν”„λ‘œνŒŒμΌ 을 μ„ μ–Έν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 클래슀 레벨 μ£Όμ„μž…λ‹ˆλ‹€ ApplicationContext. 이 주석은 메타 주석 으둜 μ‚¬μš©λ˜μ–΄ μ‚¬μš©μž 지정 μž‘μ„±λœ 주석 을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€ .

@ExtendWith: SpringExtension λŠ” μŠ€ν”„λ§ 5에 μΆ”κ°€λœ JUnit 5의 μ£Όν”Όν„°(Jupiter) λͺ¨λΈμ—μ„œ μŠ€ν”„λ§ ν…ŒμŠ€νŠΈμ»¨ν…μŠ€νŠΈ(TestContext)λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.

@DataJpaTest
@ActiveProfiles("h2")
@ExtendWith(SpringExtension.class)
@DisplayName("μ»€μŠ€ν…€ μ—”ν‹°ν‹° ν…ŒμŠ€νŠΈ")
class CustomRepositoryTest {

    @Autowired
    private CustomRepository customRepository;

    private final String content = "test10000";

    @BeforeEach
    public void beforeEach() {

        Custom dto = Custom.builder()
                .customPK(new CustomPK("naver.com", "test@naver.com"))
                .content(content)
                .build();

        customRepository.save(dto);

    }

    @Test
    @DisplayName("컨텐츠 like 절")
    public void findByContentContaining() {

        Optional<List<Custom>> list = customRepository.findByContentContaining(content);

        list.flatMap(data -> data.stream()
                .filter(value -> value.getContent().equals(content))
                .findFirst()).ifPresent(value -> {
            Assertions.assertEquals(value.getContent(), content);
        });
    }

}

Assertions.assertEquals 의 경우 λ°μ΄ν„°μ˜ 같은 유무λ₯Ό 체크 ν•΄μ£ΌλŠ” λ©”μ†Œλ“œμ΄λ‹€.
성곡을 ν•˜λ©΄ μ•„λž˜μ²˜λŸΌ pass λœλ‹€.

μŠ€ν¬λ¦°μƒ· 2021-05-22 μ˜€ν›„ 8 27 59

λ§Œμ•½ 컨텐츠 λΆ€λΆ„μ—μ„œ μ•„λž˜μ™€ 같이 λ‹€λ₯Έ 데이터λ₯Ό λ„£μ–΄μ£Όλ©΄ μ•„λž˜μ™€ 같이 fail 이 λœλ‹€.

    @Test
    @DisplayName("컨텐츠 jpa ending with 절")
    public void findByEndingWith(){
        Optional<List<Custom>> list = customRepository.findByContentEndingWith(content);
        list.flatMap(data ->
                data.stream()
                .filter(value -> value.getContent().equals(content))
                .findFirst())
                .ifPresent(value -> Assertions.assertEquals(value.getContent() , "dddd"));
    }

μŠ€ν¬λ¦°μƒ· 2021-05-23 μ˜€ν›„ 8 26 52

@BeforeAll 은 μž‘λ™ λ˜μ§€ μ•ŠλŠ”λ‹€.
ν•˜μ§€λ§Œ @BeforeEach λŠ” μž‘λ™ν•œλ‹€.

μŠ€ν¬λ¦°μƒ· 2021-05-22 μ˜€ν›„ 8 45 16

profile
Back-End Engineer

0개의 λŒ“κΈ€