티스토리 뷰

728x90
반응형

지난 글까지 비즈니스 로직과 API 계층에 테스트를 적용했다.

 

2022.09.07 - [개발/Spring] - [Spring]단위 테스트(Unit Test)

2022.09.07 - [개발/Spring] - [Spring]JUnit을 이용한 비즈니스 로직 단위 테스트

2022.09.08 - [개발/Spring] - [Spring]Hamcrest를 적용한 단위 테스트

2022.09.08 - [개발/Spring] - [Spring]Slice Test - API Layer

 

[Spring]Slice Test - API Layer

지난 글까지 테스트의 종류를 알아보고, 가장 작은 범위인 단위 테스트를 비즈니스 로직에 적용해 봤다. 2022.09.07 - [개발/Spring] - [Spring]단위 테스트(Unit Test) 2022.09.07 - [개발/Spring] - [Spring]JUn..

gnidinger.tistory.com

이번 글에선 애플리케이션의 세 계층 중 마지막 하나, 데이터 액세스 계층의 테스트에 대해 알아본다.

 

구체적으로는 이전까지 코드를 작성한 Spring Data JPA에 대한 검증을 적용한다.

 

Tests against the Database Layer

 

데이터 액세스 레이어를 테스트하는데 있어 가장 중요한 점은 사용하는 DB를 깨끗한 상태로 유지하는 것이다.

 

여기서 깨끗한 상태란 매 테스트마다 실행 이전으로 돌린(Rollback) DB의 상태를 말한다.

 

이는 특히나 JUnit을 사용하는 테스트에서 중요한데, JUnit 테스트는 테스트 케이스의 순서를 보장하지 않기 때문이다.

 

따라서 유닛 테스트의 원칙 중 하나인 테스트의 독립성 확보를 위해 DB의 상태 유지는 필수적이라 할 수 있다.

 

여기서 다루는 케이스에서는 @DataJpaTest 애너테이션으로 간단하게 구현할 수 있다.

 

Testing a MemberRepository Class

 

그럼 API 계층과 비슷하게 Repository 클래스에 대한 검증 로직을 작성해 보자.

import com.gnidinger.member.entity.Member;
import com.gnidinger.member.repository.MemberRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import static org.junit.jupiter.api.Assertions.*;

@DataJpaTest // 테스트 앱 자동 구성
public class MemberRepositoryTest {

    @Autowired
    private MemberRepository memberRepository; // MemberRepository(대상 인터페이스) DI

    @Test
    public void saveMemberTest() {

        // given - 테스트를 위한 준비과정 및 전제조건. 테스트 할 member 객체 생성
        Member member = new Member();
        member.setEmail("gni@gmail.com");
        member.setName("gni");
        member.setPhone("010-1234-5678");

        // when - Member 정보 저장
        Member savedMember = memberRepository.save(member);

        // then - 저장 여부 검증
        assertNotNull(savedMember); // savedMember 객체가 null이 아닌지 검증
        // savedMember 객체의 필드가 member 객체와 동일한지 검증
        assertTrue(member.getEmail().equals(savedMember.getEmail()));
        assertTrue(member.getName().equals(savedMember.getName()));
        assertTrue(member.getPhone().equals(savedMember.getPhone()));
    }
}

@DataJpaTest

 

@DataJpaTest는 @AutoConfigureMockMvc와 비슷하게 데이터 액세스 계층 테스트 앱의 자동 구성을 도와준다.

 

@AutoConfigureDataJpa을 포함하고 있기 때문인데,

 

추가로 @Transactional 애너테이션도 포함하고 있어 매 테스트마다 DB가 Rollback 되는 것을 보장한다.

 

 

계속해서 MemberRepository의 중복 이메일  조회 기능인 findByEmail() 메서드를 검증하자.

 

테스트 클래스 하단에 다음과 같이 추가하면 된다.

...

import java.util.Optional;

@DataJpaTest
public class MemberRepositoryTest {
    ...
    
    @Test
    public void findByEmailTest() {

        // given - 테스트 할 member 객체 생성
        Member member = new Member();
        member.setEmail("gni@gmail.com");
        member.setName("gni");
        member.setPhone("010-1234-5678");

        // when - member객체 정보 저장
        memberRepository.save(member);
        Optional<Member> findMember = memberRepository.findByEmail(member.getEmail());

        // then - 리턴되는 Member객체가 아닌 이메일로 조회하는 findByEmail() 사용
        assertTrue(findMember.isPresent()); // 회원 정보가 null이 아닌지 검증
        assertTrue(findMember.get().getEmail().equals(member.getEmail())); // 조회 결과와 테스트 데이터 일치 검증
    }
}

추가로 Spring JDBC나 Spring Data JDBC 환경에서는 @DataJdbcTest을 사용해 테스트를 구성할 수 있다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함