관리 메뉴

제뉴어리의 모든것

[Section3] [Spring MVC] 테스팅(Testing) - 3 (데이터 액세스 계층 테스트) 본문

코드스테이츠/정리 블로깅

[Section3] [Spring MVC] 테스팅(Testing) - 3 (데이터 액세스 계층 테스트)

제뉴어리맨 2022. 9. 17. 13:59

아래의 내용들을 보기 전에 

https://januaryman.tistory.com/458

 

테스트시 사용되는 각종 애노테이션

사전 지식 Mockito는 Mock 객체를 생성하고, 해당 Mock 객체가 진짜처럼 동작하게 하는 기능을 하는 Mocking framework(또는 라이브러리)이다. @SpringBootTest 클래스 레벨에 붙이는 애노테이션. @SpringBootAppl..

januaryman.tistory.com

위에 포스트를 봐두면 좋을것이다.

 

 

이번 시간은 데이터 액세스 (Repository) 계층만 테스트해보도록 하겠다.

해당 포스트는 공부용입니다.

잘못된 정보를 올리지 않으려고 노력하지만 간혹 존재할 수가 있고, 불필요한 내용이 존재하고 있을 수도 있습니다.

 

build.gradle

plugins {
	id 'org.springframework.boot' version '2.7.1'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.codestates'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	implementation 'org.mapstruct:mapstruct:1.4.2.Final'
	annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
	implementation 'org.springframework.boot:spring-boot-starter-mail'
	implementation 'com.google.code.gson:gson:2.9.0'
}

tasks.named('test') {
	useJUnitPlatform()
}

 

데이터 액세스 계층을 테스트 하기 위한 한 가지 규칙

DB의 상태를 테스트 케이스 실행 이전으로 되돌려서 깨끗하게 만든다.

 

왜냐하면 각각의 테스트는 다른 테스트에 영향을 주어선 안된다.

이미 저장되고, 테스트시에 계속 쌓이는 데이터를 가지고 여러 테스트에서 사용하게 되면 테스트의 신뢰성이 떨어질 수 있기때문이다.

 

데이터 액세스 계층 테스트의 기본 구조

  • 예제 코드
import com.codestates.member.entity.Member;
import com.codestates.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   // (1)
public class MemberRepositoryTest {
    @Autowired
    private MemberRepository memberRepository;   // (2)

    @Test
    public void saveMemberTest() {
        // given  (3)
        Member member = new Member();
        member.setEmail("hgd@gmail.com");
        member.setName("홍길동");
        member.setPhone("010-1111-2222");

        // when  (4)
        Member savedMember = memberRepository.save(member);

        // then  (5)
        assertNotNull(savedMember); // (5-1)
        assertTrue(member.getEmail().equals(savedMember.getEmail()));
        assertTrue(member.getName().equals(savedMember.getName()));
        assertTrue(member.getPhone().equals(savedMember.getPhone()));
    }
}

(1) : JPA 의 기능을 테스트 하기 위한 테스트 환경을 만들어줌.그러므로, JpaRepository 들을 빈으로 등록해준다던가, @Entity 붙은 클래스들을 엔티티로써 인식 해준다던가,jpa의 repository 의 기능을 사용할 수 있게끔 세팅을 해준다고 생각하면된다. 그리고 참고로 @Transactional 애노테이션도 포함고 있으므로, 해당 테스트 클래스의 테스트 메소드들은 모두 트랜잭션 처리가 됬다고 생각하면된다.

 

참조 : https://velog.io/@ayoung0073/DataJpaTest

 

(2) :

빈으로 등록된 Repository를 필드 주입 받고 있다

 

(3) :

Entity 생성 과정이다.

 

(4) :

회원 정보 저장 부분이다.

 

(5) : 

repository의 처리 결과에 대한 검증 부분이다.

 

 

@DataJpaTest 가 Import 해주는 자동 구성 기능들

org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration 
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration 
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration 
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration 
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration 
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration 
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration 
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration 
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration 
org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration 
org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration

위에 내용들을 자동으로 Import 해주면서

앱에 존재하는 모든 빈을 스프링컨테이너에 등록하는것이 아닌, 데이터 액세스 계층에서 필요한 빈들만 등록해주는것이다.

 

 


참조 : https://velog.io/@ayoung0073/DataJpaTest