JPA Repository TEST 작성법
@ActiveProfiles("test")
@DisplayName("JPA 연결 테스트")
@Import(JpaRepositoryTest.TestJpaConfig.class)
@DataJpaTest
class JpaRepositoryTest {
private final ArticleRepository articleRepository;
private final ArticleCommentRepository articleCommentRepository;
private final UserRepository userRepository;
// 생성자 주입 패턴
public JpaRepositoryTest(@Autowired ArticleRepository articleRepository,
@Autowired ArticleCommentRepository articleCommentRepository,
@Autowired UserRepository userRepository
) {
this.articleRepository = articleRepository;
this.articleCommentRepository = articleCommentRepository;
this.userRepository = userRepository;
}
}
@ActiveProfiles("test")
: spring profile을 설정 할 수 있다.import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
@ActiveProfiles("test")
@SpringBootTest
class BoardToyProjectApplicationTests {
@Test
void contextLoads() {
}
}
spring:
config:
activate:
on-profile: test
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
spring:
config:
activate:
on-profile: test
datasource:
url: jdbc:h2:mem:testdb;MODE=MariaDB;DATABASE_TO_LOWER=TRUE
driver-class-name: org.h2.Driver
test:
database:
replace: none
url: jdbc:h2:mem:testdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH
url: jdbc:h2:mem:testdb;MODE=Mariadb
@Transactional
이 걸려있다.@Transactional
의 기본 값은 Rollback으로 동작한다.saveAndFlush()
또는 flush()
를 실행해야 한다.@DisplayName("update 테스트")
@Test
void update_test() {
// given
Article article = articleRepository.findById(1L).orElseThrow();
String updatedHashtag = "#springboot";
article.setHashtag(updatedHashtag);
// when
Article savedArticle = articleRepository.saveAndFlush(article);
// articleRepository.flush();
// then
assertThat(savedArticle).hasFieldOrPropertyWithValue("hashtag", updatedHashtag);
}
@DataJpaTest
: 슬라이스 테스트 용도로 SpringBoot Bean으로 등록을 안한 상태에서 테스트를 한다. 이를 그러면 Config를 포함할 것을 추가해야한다.@Import(JpaRepositoryTest.TestJpaConfig.class)
class JpaRepositoryTest {
private final ArticleRepository articleRepository;
private final ArticleCommentRepository articleCommentRepository;
private final UserRepository userRepository;
// 생성자 주입 패턴
public JpaRepositoryTest(@Autowired ArticleRepository articleRepository,
@Autowired ArticleCommentRepository articleCommentRepository,
@Autowired UserRepository userRepository
) {
this.articleRepository = articleRepository;
this.articleCommentRepository = articleCommentRepository;
this.userRepository = userRepository;
}
}
@AutoWired private ArticeRepository articleRepository
로 주입을 받아도 된다.