menuhwang

[Spring Boot] Repository 단위 테스트 (3/5) 본문

스터디/Spring

[Spring Boot] Repository 단위 테스트 (3/5)

menuhwang 2022. 9. 8. 17:46

Repository 단위 테스트


 

 

테스트 코드


@DataJpaTest
class BoardRepositoryTest {
    private final String AUTHOR = "user";
    private final String TITLE = "Hi";
    private final String DESCRIPTION = "Nice to meet you";
    private final int INIT_LIKE = 0;

    @Autowired
    private BoardRepository boardRepository;

    @Test
    public void saveTest() {
        Board board = Board.builder()
                .author(AUTHOR)
                .title(TITLE)
                .description(DESCRIPTION)
                .build();

        Board saved = boardRepository.save(board);
        Board found = boardRepository.findById(saved.getId()).get();

        assertNotNull(found.getId());
        assertEquals(AUTHOR, found.getAuthor());
        assertEquals(TITLE, found.getTitle());
        assertEquals(DESCRIPTION, found.getDescription());
        assertEquals(INIT_LIKE, found.getThumb());
        assertNotNull(found.getCreated_timestamp());
    }
}

 

 

 

@DataJpaTest


 Repository 테스트에서는 DB에 정상적으로 변동 사항이 적용되는지 확인한다. @DataJpaTest 어노테이션 안에는 이를 도와주는 어노테이션이 포함되어있다.

 

@Transactional

 테스트를 위해 저장되고 삭제되는 데이터들이 테스트 후에 남으면 안돼기때문에 @Transactional 어노테이션이 포함되어있다. 테스트를 마치면 최초 상태로 돌아가기 위해 rollback 된다.

 

@AutoConfigure~

 JPA 관련 설정만 자동으로 불러온다. 기본적으로 embedded DB인 h2를 사용한다. 따라서 실제로 사용되는 DB에 영향을 미치지 않는다.

 

 

 


JPA 동작

@DataJpaTest로 인해 모든 test는 트랜잭션 적용됨.

board는 아직 영속성 컨텍스트에 올라가지 않은 new 상태.

boardRepository.save()를 실행하면 EntityManager.persist()로 인해 board는 managed 상태가 됨. (board = saved)

boardRepository.findById()를 실행하면 영속성 컨텍스트 1차 캐시에서 값이 있는지 확인.
(하나의 transaction이기 때문)

값이 있으면 DB까지 접근하지 않고 (sql문을 날리지 않고) 캐시에서 값을 가져옴.

 

 

 

Comments