*테스트 어노테이션
@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("예외가 발생해야 한다."); //여기줄까지 오면안됨
}
}
'Java > Spring-app' 카테고리의 다른 글
상품 리포지토리 개발 (0) | 2023.06.08 |
---|---|
상품 엔티티 개발 // setter없이 수정하는법 (0) | 2023.06.08 |
회원 서비스 개발 //의존관계주입, @Transactional(readOnly) (1) | 2023.06.06 |
회원 리포지토리 개발 (0) | 2023.06.06 |
엔티티 설계시 주의점 // Setter제거 (0) | 2023.06.06 |