@RunWith(SpringRunner.class)
@SpringBootTest
두가지 넣으면 스프링과 통합테스트( DB까지 )
두개 모두 있어야 스프링부트 올려서 테스트 가능.
@Transactional//데이터를변경해야하기 떄문에 , 그리고 롤백이됨.
엔티티매니저에 persist 하면 DB에 INSERT문에 나갈까??
->> 안나감. (DB Transaction이 commit 될 때 flush가 되면서 DB에 INSERT쿼리가 나간다.)
@Transactional 이 테스트클래스에 있으면 기본적으로 롤백을 해버림 ( 커밋 안함 )=영속성 컨텍스트가 flush안함.
하지만 개별 @Test에 @Rollback(false)를 적어두면 롤백안함=커밋=flush=DB에 실제 반영.
실제로 INSERT문에 나가는것을 볼수있다.
진짜 적용됨.
-------------------------------------------내가 방금 처럼 굳이 쿼리 나가는것보고싶다.(하지만 이 방법은 실제 DB에 조회 되진 않음. 실제로 영속성 컨텍스트에서 쿼리가 나가는 건 찍히지만 그 뒤에 @Transactional이 Rollback 하기 떄문에.
( 회원가입() 이 끝날 때 롤백시킴.)
em.flush();
엔티티매니저 주입받고 em.flush() 하면된다.
( memberService.join에서 member 객체가 영속성 컨텍스트에 들어간다. ( em.persist(member) )
flush해주면 DB에 반영한다. = flush하면 DB에 강제로 쿼리가 나감. ( 영속성 컨텍스트에 있는 것들을
정리 : 실제 DB반영 확인은 @Rollback(false) 밖에없음.
---------------------------------------------------- 중복_회원_예외()
checkedexception 안잡으면 계속 튀어나옴.ㄹ
validateDuplicateMember -> join -> 테스트 코드 까지와서 터짐.
이렇게 바꿀 수 있다. 튀어나오는 exception이 IllegalStateException 이면 테스트 성공.
---------------------------------------------------------------------------------------------------------------
테스트 때문에 DB를 외부에 설치하기 귀찮다. 어차피 끝나면 데이터 초기화 되는데,
그래서 자바 띄울 때 자바 안에 DB를 살짝 새로 만들어서 띄우는 방법이있다.=메모리 DB
->스프링 부트에서 제공해줌.
테스트 폴터에 resources 만들어서 application.yml 만들어두면 테스트할 때는 이게 우선권을 가짐. ( main의 application.yml은 무시됨 )
mem:test로만 바꿔주면 메모리 db로 사용가능.
외부H2를 내려도 작동되는 것 확인 가능.
그런데
이렇게 해도 메모리db로 됨.. -> 스프링 부트가 기본설정이 메모리모드로 test돌림. ( 이 떄도 자동으로 커넥션이 mem:test 로 돌아감)
메모리db는 was(톰켓) 이랑 같이 뜬다.
'Java, Spring > 스프링부트와 JPA 활용 1' 카테고리의 다른 글
6-1. 주문, 주문상품 엔티티 개발 (0) | 2022.08.13 |
---|---|
5. 상품 도메인 개발 (0) | 2022.08.12 |
4-1. 회원 리포지토리 개발 ~ 4-2. 회원 서비스 개발 (0) | 2022.08.12 |
2-5. 엔티티 설계시 주의점 (0) | 2022.08.11 |
2-4. 엔티티 클래스 개발2(다대다) (0) | 2022.08.11 |