Java/Spring Boot
Test code 작성
amungstudy
2023. 9. 15. 13:54
import static org.assertj.core.api.Assertions.*;
assertj : 값의 비교를 도와줌.
예제)
assertThat(member).isEqualTo(result);
@Test
public void save(){
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();
assertThat(member).isEqualTo(result);
}
예제2) - 에러나는 경우
@Test
public void findByName(){
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
Member result = repository.findByName("spring2").get();
assertThat(result).isEqualTo(member1);
}
result는 member2라서 에러 발생
assertThrows : 예외가 발생하는지 확인
// 해당 예외가 발생하는지 확인함
assertThrows(IllegalStateException.class, () -> memberService.join(member2));
에러 메세지도 검증이 가능하다.
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
테스트 작성시 주의점
여러 테스트가 순서 상관없이 실행되어야함.
따라서 테스트 수행 후 저장소나 공용데이터를 지워주어야 함.
// 메소드 실행이 끝날때마다 동작하는 콜백메소드
@AfterEach
public void afterEach(){
repository.clearStore();
}
이 경우에는
MemoryMemberRepository.java에 Map을 비워주는 메소드를 만들어서 테스트메소드 실행 후 비워줌.
public void clearStore(){
store.clear();
}
@Transactional
DB를 이용해서 테스트 후 넣은 데이터를 rollback해서 지워줌.(testcase에 붙었을 때만 이렇게 동작함.)
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
이렇게 하면 DB의 실제 데이터에 반영이 안됨.
@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.
@Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고,
테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지
않는다.