엔티티 등록을 위한 repository부터 개발을 할 것이다.
제일 먼저 MembershipRepository에 대한 테스트 클래스부터 작성한다.
public class MembershipRepositoryTest{
@Autowired
private MembershipRepository membershipRepository;
}
실제 코드를 짤때는 생성자 주입을 하도록 한다. 지금은 테스트 코드 이므로 간편하게 필드 주입을 사용한다.
@Test
void 레파지토리isNotNull(){
Assertions.assertThat(membershipRepository).isNotNull();
}
컴파일 오류가 날 것이다.
해당 레파지토리와 엔티티가 없기 때문이다.
레파지토리와 엔티티를 만들어보고 다시 실행시켜보자
@Repository
public interface MembershipRepository extends JpaRepository<Membership, Long> {
}
@Entity
@Getter
@NoArgsConstructor
@Builder
@AllArgsConstructor
@Table
public class Membership {
}
다시 실행시켜보면 컴파일 오류가 날 것이다.
이 테스트에서 레파지토리의 빈 생성을 못했기 때문이다.
따라서 @SpringBootTest 어노테이션을 사용해서 테스트 파일 바깥에 있는 레파지토리 파일을 빈으로 생성해서 테스트를 한다.
(사실 테스트 코드를 작성할 때 필요한 클래스들은 테스트 안에 넣고 하는것이 정석이지만, 나는 main파일에 넣고 하였다.)
@SpringBootTest가 아닌 @DataJpaTest 어노테이션을 사용해도 된다.
@DataJpaTest: JPA Repository들에 대한 빈들을 등록하여 단위 테스트의 작성을 용이하게 함
또한, @DataJpaTest에는 @Transactional 어노테이션이 있어서, 테스트의 롤백 등을 위해 별도로 트랜잭션 어노테이션을 추가하지 않아도 된다.
다시 테스트코드를 실행 시켜보면 에러가 난다.
오류 내용을 살펴보면 Entity클래스(Membership)에 식별자 (id)가 없다는 오류였다. 그래서 간단하게 id값만 작성하고 다시 테스트를 돌려보았다.
드디어 테스트에 성공했다.
이후 레파지토리가 null이 아닌것을 확인했으니 해당 테스트는 제거한다. (리팩토링)
테스트 작성 코드 내역을 보면
제일 먼저 우리가 필요한 요구 사항을 코드로 짰다.
테스트 코드를 성공시키기 위한 실제 코드를 작성한다.(레파지토리, 엔티티)
리팩토링
테스트는 이런 식으로 돌아가는 것을 알아볼 수 있었다. 이제 차근차근 테스트 흐름을 이해하고 작성을 이어나가 보자
(성공 이후 리팩토링은 필수다!!)