인생 디벨로퍼

[0단계] JPA Repository Test 본문

Project/Final Project - Sporting (매칭)

[0단계] JPA Repository Test

뫄뫙뫄 2023. 4. 26. 14:43
728x90
반응형

1. 초기세팅

  1. Entity 작성 후 공유 받음.
  2. data jpa 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

2. 테스트 필수 어노테이션

@DataJpaTest JPA Repository를 테스트하기 위한 애노테이션
@ComponentScan 해당 어노테이션이 위치한 클래스를 시작으로 자동으로 컴포넌트를 스캔하여 Spring Context에 등록
@SpringJUnitConfig 어노테이션이 위치한 클래스나 메소드를 실행할 때 Spring Context를 로드하고 관리

3. BeforeEach 주입

@BeforeEach
    public void init() {
        setUp("ssar", "role", "1234", "player", null, null, UserStatus.인증대기);
    }

    private User setUp(String nickname, String email, String password, String role, LocalDateTime createdAt,
            LocalDateTime updatedAt, UserStatus status) {

        User user = new User();
        user.setNickname(nickname);
        user.setEmail(email);
        user.setPassword(password);
        user.setRole(role);
        user.setCreatedAt(createdAt);
        user.setUpdatedAt(updatedAt);
        user.setStatus(status);

        return this.entityManager.persist(user);
    }

4. select All

@Test
    void selectAll() {
        List<User> users = userRepository.findAll();
        Assertions.assertNotEquals(users.size(), 0);

        User user = users.get(0);
        Assertions.assertEquals(user.getNickname(), "ssar");
        System.out.println("테스트 : " + user.getCreatedAt()); //2023-04-12T15:28:58.868996300
    }

5. Select findById / Update

@Test
    @Transactional
    void selectAndUpdate() {
        var optionalUser = this.userRepository.findById(1L);

        if (optionalUser.isPresent()) { 
            var result = optionalUser.get();
            Assertions.assertEquals(result.getNickname(), "ssar");

//select -> 1번 유저 select

            var nickName = "ssar123";
            result.setNickname(nickName);
            User merge = entityManager.merge(result);

//merge Nickname 값 Merge

            Assertions.assertEquals(merge.getNickname(), "ssar123");
        } else {
            Assertions.assertNotNull(optionalUser.get());
        }
    }

optionalUser.isPresent() → optionalUser 안에 값이 존재하는지 확인

merge() → 이미 존재하는 엔티티는 업데이트하고, 존재하지 않는 엔티티는 새로운 엔티티로 인식하여 데이터베이스에 저장

다운캐스팅 해주기

6. Inser / Delete

@Test
    void insertAndDelete() {
        User user = setUp("love", "love@nate.com", "1234", "player", LocalDateTime.now(), LocalDateTime.now(),
                UserStatus.인증대기);
        Optional<User> findUser = this.userRepository.findById(user.getId());
//insert

        if (findUser.isPresent()) {

            var result = findUser.get();
            Assertions.assertEquals(result.getNickname(), "love");
//insert 확인

            entityManager.remove(user);
//delete

            Optional<User> deleteUser = this.userRepository.findById(user.getId());
            if (deleteUser.isPresent()) {
                Assertions.assertNull(deleteUser.get());
//delete 확인

            }
        } else {
            Assertions.assertNotNull(findUser.get());
        }
    }

 

7. BeforeEach 초기화

@Autowired
    private EntityManager em;
 em.createNativeQuery("ALTER TABLE user_tb ALTER COLUMN ID RESTART WITH 1").executeUpdate();

class 단위 테스트 진행을 위해, 초기화 .


동일 방식으로, 테스트 진행!

728x90
반응형

'Project > Final Project - Sporting (매칭)' 카테고리의 다른 글

[2단계] Admin page Court view  (0) 2023.05.01
[1단계] Stadium Detail  (0) 2023.05.01
[1단계] Company Update Form  (0) 2023.05.01
[3단계] sentry.io 적용  (0) 2023.05.01
[1단계] 기업 회원가입  (0) 2023.04.26