목차
개요
Spring Boot를 사용하여 프로젝트 구현 때, DB와 관련된 테스트를 진행하기 위한 방법을 연습하고자 했습니다. 분명 테스트 진행 후 롤백시켜서 DB에 영향을 안끼치는 무언가가 있었다는 점을 알고 있었지만 기억이 나지 않아 다시 공부하고 또 찾을 때를 대비해 기록을 남겨 놓고자 합니다.
@DataJPATest
분명 테스트 진행 후 롤백시켜서 DB에 영향을 안끼치는 무언가를 잊어먹었던 그 무언가는 @DataJPATest입니다. @DataJPATest는 우선 기본적으로 메모리 DB를 사용하도록 되어 있고 @Transactional이 걸려있기에 테스트 이후 롤백되어 DB에 영향을 안미치도록 되어있습니다.
또한 만약 실제 DB에서의 테스트를 원한다면 설정을 통해 실제 DB 환경에서의 테스트도 가능하다고 합니다.
실습
실습은 간단하게 Member 클래스를 생성한 후 Member 클래스를 생성하고 조회하는 과정을 테스트해보는 것으로 진행했습니다.
우선 Member 클래스를 생성해 Entity를 만들었습니다.
@Entity
@Getter
@NoArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String password;
@Builder
public Member(String name, String email, String password) {
this.name = name;
this.email = email;
this.password = password;
}
}
이후 JpaRepository를 상속한 MemberRepository를 생성하여 CRUD가 가능하도록 만들었습니다.
public interface MemberRepository extends JpaRepository<Member, Long> {
}
마지막으로 @DataJpaTest를 이용한 테스트를 생성한 후 저장 테스트와 조회 테스트를 진행했습니다.
@DataJpaTest
class MemberRepositoryTest {
@Autowired
private MemberRepository memberRepository;
@Test
@DisplayName("멤버 DB 저장 테스트")
void saveMember() {
Member member = Member.builder()
.email("taehee@tistory.com")
.name("taehee")
.password("1234")
.build();
Member savedMember = memberRepository.save(member);
assertThat(member).isSameAs(savedMember);
}
@Test
@DisplayName("멤버 DB 조회 테스트")
void findMember() {
Member member = Member.builder()
.email("taehee@tistory.com")
.name("taehee")
.password("1234")
.build();
Member savedMember = memberRepository.save(member);
Member findMember = memberRepository.findById(member.getId()).orElseThrow(() -> new IllegalArgumentException("Member Not Found, memberId: " + savedMember.getId()));
assertThat(findMember).isSameAs(savedMember);
}
}
마치며
정말 간단한 테스트였고 @DataJpaTest를 활용해본다 정도였습니다. 실제 서비스 구현할 때 발생하는 Join이라든가 복잡한 Query로 생성된 결과물을 테스트하는 방법을 실험해봐야 조금 더 감이 잡힐 것 같습니다. 또한 찾아보니 Embedded MongoDB Database라는 것도 있어서 MongoDB를 사용하는 유저에게 유닛 테스트를 위한 인메모리 MongoDB를 지원하는 것으로 보였습니다.
그리고 Spring Testing Document를 보니 굉장히 뭐가 많던데 하나씩 공부를 해봐야 할 것 같습니다.
Reference
https://dublin-java.tistory.com/49
https://cobbybb.tistory.com/23
https://0soo.tistory.com/40#Entity%-C%--Repository
'Spring > Testing' 카테고리의 다른 글
Spring Boot 없이 xml로 환경 설정 할 때 JUnit Bean 주입 (이슈 내용 정리) (3) | 2024.10.28 |
---|