🚨오늘 마감🚨100% 당첨 쿠폰이 있어요!

인프런 워밍업 클럽 스터디 3기 - backend <2주 발자국>

package com.example.portfolio.domain.repository

import com.example.portfolio.domain.constant.SkillType
import com.example.portfolio.domain.entity.*
import org.assertj.core.api.Assertions
import org.assertj.core.api.Assertions.*
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest

@DataJpaTest // jpa 관련 컴포넌트만 로드하여 테스트 수행
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class ProjectRepositoryTest(
    @Autowired val projectRepository: ProjectRepository,
    @Autowired val skillRepository: SkillRepository
) {
    val DATA_SIZE = 10
    private fun createProject(n: Int): Project {
        val project = Project(
            name = "${n}",
            description = "테스트 설명 {n}",
            startYear = 2023,
            startMonth = 9,
            endYear = 2023,
            endMonth = 9,
            isActive = true
        )

        val details = mutableListOf<ProjectDetail>()
        for (i in 1..n) {
            val projectDetail = ProjectDetail(content = "테스트 ${i}", url = null, isActive = true)
            details.add(projectDetail)
        }
        project.addDetails(details)

        val skills = skillRepository.findAll() // List<Skill> 반환
        val skillsUsedInProject = skills.subList(0, n) // 0부터 n까지의 리스트 반환
        for (skill in skillsUsedInProject) {
            val projectSkill = ProjectSkill(project = project, skill = skill)
            project.skills.add(projectSkill)

        }
        return project
    }

    @BeforeAll // 인스턴스 메소드 사용
    fun beforeAll() {
        println("----- 스킬 데이터 초기화 시작 -----")
        val skills = mutableListOf<Skill>()
        for (i in 1..DATA_SIZE) {
            val skillTypes = SkillType.values()
            val skill = Skill(name = "테스트 ${i}", type = skillTypes[i % skillTypes.size].name, isActive = true)
            skills.add(skill)
        }
        skillRepository.saveAll(skills)
        println("----- 스킬 데이터 초기화 종료 -----")

        println("----- 데이터 초기화 이전 조회 시작 -----")
        val beforeInsert = projectRepository.findAll()
        assertThat(beforeInsert).hasSize(0)
        println("----- 데이터 초기화 이전 조회 종료 -----")

        println("----- 테스트 데이터 초기화 시작 -----")
        val projects = mutableListOf<Project>()
        for (i in 1..DATA_SIZE) {
            val project = createProject(i)
            projects.add(project)
        }
        projectRepository.saveAll(projects)
        println("----- 테스트 데이터 초기화 종료 -----")
    }

    @Test
    fun testFindAll() {
        println("----- findAll 테스트 시작 -----")
        val projects = projectRepository.findAll()
        assertThat(projects).hasSize(DATA_SIZE)
        println("projects.size: ${projects.size}")

        for (project in projects) {
            assertThat(project.details).hasSize(project.name.toInt())
            println("project.details.size: ${project.details.size}")

            assertThat(project.skills).hasSize(project.name.toInt())
            println("project.skills.size: ${project.skills.size}")
        }
        println("----- findAll 테스트 종료 -----")

    }

    @Test
    fun testFindAllByIsActive() {
        println("----- findAllByIsActive 테스트 시작 -----")
        val projects = projectRepository.findAllByisActive(true)
        assertThat(projects).hasSize(DATA_SIZE)
        println("projects.size: ${projects.size}")

        for (project in projects) {
            assertThat(project.details).hasSize(project.name.toInt())
            println("project.details.size: ${project.details.size}")

            assertThat(project.skills).hasSize(project.name.toInt())
            println("project.skills.size: ${project.skills.size}")
        }
        println("----- findAllByIsActive 테스트 종료 -----")
    }
}



1. @DataJpaTest
JPA 관련 테스트를 실행하도록 하는 어노테이션

JPA 관련 컴포넌트만 로드한다.
임베디드 데이터베이스(H2, HSQL 등)를 사용하고 자동으로 롤백된다.
테스트의 독립성을 보장한다.

2. @BeforeAll

초기 데이터를 세팅하는 데 붙이는 메서드에 붙이는 JUnit 어노테이션

한 번만 실행되며 데이터베이스 어노테이션

@TestInstance(TestInstance.Lifecycle.PER_CLASS) 와 함께 사용해야 함

 

  1. Lazy vs Eager

Lazy : 연관된 엔터티에 실제로 접근할 때 조회된다.
Eager : 엔터티를 조회할 때 연관된 엔터티도 함께 조회한다.

#### 소감
이번 주는 많이 못했어도 다음 주에는 많이 할 예정입니다.

댓글을 작성해보세요.


채널톡 아이콘