관리 메뉴

Mini

회원 기능 테스트 본문

Java/Spring-app

회원 기능 테스트

Mini_96 2023. 6. 7. 00:01

*테스트 어노테이션

@RunWith(SpringRunner.class)    //JUnit 실행할때 스프링이랑 같이 실행해줘
@SpringBootTest //Spring boot 띄운상태로 테스트 돌려줘. (없으면 Autowired 안됨)
@Transactional
public class MemberServiceTest {

* 회원가입검사

Transactional

문제 : Test 내의 Transactional은 기본값이 롤백 => insert 쿼리등 확인불가

해결 1 : Transactional(Rollback=false)

해결2: em 받고, em.flush

    @Autowired EntityManager em;

    @Test
    public void 회원가입() throws Exception{
        //given
        Member member=new Member();
        member.setName("kim");

        //when
        Long savedId= memberService.join(member);

        //then
        em.flush(); //강제로 쿼리날려

 

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class MemberServiceTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;
    //@Autowired EntityManager em;

    @Test
    public void 회원가입() throws Exception{
        //given
        Member member=new Member();
        member.setName("kim");

        //when
        Long savedId= memberService.join(member);

        //then
        //em.flush(); //강제로 쿼리날려
        assertEquals(member,memberRepository.findOne(savedId)); //멤버랑 찾은얘랑 같은가? ㅇㅇ 같은 영속성에서 pk가 같으면 같음.
    }

 

* 회원 중복 검사

    @Test
    public void 중복_회원_예외() throws Exception{
        //given
        Member member1=new Member();
        member1.setName("kim");

        Member member2=new Member();
        member2.setName("kim");

        //when
        memberService.join(member1);
        try {
            memberService.join(member2);    //예외가 발생해야한다.
        }catch (IllegalStateException e){
            return;
        }

        //then
        fail("예외가 발생해야 한다.");   //여기줄까지 오면안됨

문제 : 코드지저분함, join에서 예외던지면 catch해서 리턴.

해결 : 예외터져서 나간애가 Illegal이면 됨.

@Test(expected = IllegalStateException.class)

 

*외부 DB 접근문제

문제 : Test시 실제외부 DB 접근이 맘에안듬, 귀찮, 설치필요

해결1 : 메모리DB

1. test -resource-yml 만듬. => test시에 우선권. test만의 설정가능.

2.yml.url 수정

spring:
  datasource:
    url: jdbc:h2:mem:test

해결2 : yml - spring 빈칸으로두면 -> 기본값이 메모리DB임.

※ test-yml-jpa 기본값 : create-drop => test 종료시 table drop => 깨끗이 정리

jpa:
  hibernate:
    ddl-auto: create-drop

 

*최종코드

package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)    //JUnit 실행할때 스프링이랑 같이 실행해줘
@SpringBootTest //Spring boot 띄운상태로 테스트 돌려줘. (없으면 Autowired 안됨)
@Transactional
public class MemberServiceTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

    @Test
    public void 회원가입() throws Exception{
        //given
        Member member=new Member();
        member.setName("kim");

        //when
        Long savedId= memberService.join(member);

        //then
        assertEquals(member,memberRepository.findOne(savedId)); //멤버랑 찾은얘랑 같은가? ㅇㅇ 같은 영속성에서 pk가 같으면 같음.
    }

    @Test(expected = IllegalStateException.class)
    public void 중복_회원_예외() throws Exception{
        //given
        Member member1=new Member();
        member1.setName("kim");

        Member member2=new Member();
        member2.setName("kim");

        //when
        memberService.join(member1);
        memberService.join(member2);    //예외가 발생해야한다.


        //then
        fail("예외가 발생해야 한다.");   //여기줄까지 오면안됨
    }
}