공적's life

Spring boot test 전략 - Entity Test 본문

Programing

Spring boot test 전략 - Entity Test

melpis 2019. 4. 10. 09:38

Spring boot에서 Entity를 테스트 하기 위해서는 아래와 같은 설정을 필요로 합니다.

@RunWith(SpringRunner.class)
@DataJpaTest

@RunWith 이건 설명을 생략하고

@DataJpaTest 어노테이션에 대해서 간략히 설명하면

@Transactional
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureTestEntityManager

@DataJpaTest은 어노테이션을 가지고 있습니다.

AutoConfigure가 붙어 있는 어노테이션은 "META-INF/spring.factories" 에서 클래스를 가져와서 생성됩니다.

  • @AutoConfigureDataJpa 이 어노테이션은 JpaRepository를 사용하게 해주고

  • @AutoConfigureTestDatabase는 classloader에서 로딩된 클래스를 판단하여 아래 DB를 사용하게 해줍니다.

    • H2 Database
    • Derby Database
    • HSQL Database
  • @AutoConfigureTestEntityManager는 TestEntityManager는 사용 하게 해줍니다.

작성한 Entity class는 아래와 같습니다.

@Entity
@Getter 
@NoArgsConstructor
public class Board {

    @Id @GeneratedValue
    private Long id;

    private String subject;

    private String content;

    private int readCount;

    public Board(String subject, String content){
        Assert.hasLength(subject, "Subject must not be empty");
        this.subject = subject;
        this.content = content;
        this.readCount = 0;
    }
}

위 Entity는 subject만 필수로 넣어야 하고 나머지는 필수값이 아닙니다.

그럼 이제 남은 문제는 어떤것을 테스트 해야 하는가?
일단 제가 생각한것은 2가지 입니다.

첫번째로는 Exception Case 입니다.
Exception Case는 위 설정이 없더라도 충분히 테스트 가능하겠죠?

두번째로는 저장이 잘되는지 입니다.
이것은 TestEntityManager를 활용하면 충분히 테스트 가능하겠죠?

아래 코드는 위 Case를 바탕으로 작성한 코드 입니다.

@RunWith(SpringRunner.class)
@DataJpaTest
public class BoardTest {

    @Autowired
    private TestEntityManager entityManager;

    @Test
    public void createWhenSubjectIsNullShouldThrowException() {
        assertThatIllegalArgumentException().isThrownBy(() -> new Board(null, "content"))
                .withMessage("Subject must not be empty");
    }

    @Test
    public void createWhenSubjectIsEmptyShouldThrowException() {
        assertThatIllegalArgumentException().isThrownBy(() -> new Board("", "content"))
                .withMessage("Subject must not be empty");
    }

    @Test
    public void saveShouldPersistData() {
        Board board = this.entityManager.persistFlushFind(new Board("subject", "content"));
        assertThat(board.getSubject()).isEqualTo("subject");
        assertThat(board.getContent()).isEqualTo("content");
    }

}

그럼 다음에는 Repository 테스트 전략을 작성해보겠습니다.