이전에는 무작전 @SpringBootTest를 사용하였는데, 이럴 경우 모든 빈들이 등록되어야 하기 때문에 테스트가 무거워지는 문제점이 있다고 한다. 구현 단계별 단위테스트 방법을 공부해서 필요한 시점에 필요한 테스트만 진행할 수 있도록 정리하려고 한다. 이번 글에서는 그중 Repository 테스트를 진행할 때 필요한 내용들을 정리하였다.
a. @DataJpaTest
@DataJpaTest
class ArticleRepositoryTest{
테스트 코드
}
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase.
@AutoConfigureTestDataBase
애노테이션 설정을 통해 기존 DB를 그대로 사용할 수 있도록 해주어야 한다. 테스트 코드를 아래와 같이 바꿨다.(H2 DB를 사용할 거라면 건드릴 필요 없음)@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest
class ArticleRepositoryTest{
테스트 코드
}
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.jscode.demoApp.repository.ArticleRepositoryTest': Unsatisfied dependency expressed through field 'articleRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.jscode.demoApp.repository.ArticleRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
@Import({JpaConfig.class, ArticleRepositoryWithVanillaJpa.class})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest
class ArticleRepositoryTest{
테스트 코드
}
@TestPropertySource(locations = "classpath:application-test.properties")
@DataJpaTest
선언@AutoConfigureTestDatabase
선언(memory DB를 사용하지 않은 경우)@Import
선언 : @DataJpaTest
선언에 따라 자동 주입이 불가능한 경우 Config나 Repository 빈이 있는 경우@TestPropertySource
선언 : 별도 테스트 프로퍼티 파일이 있는 경우@TestPropertySource(locations = "classpath:application-test.properties")
@Import({JpaConfig.class, ArticleRepositoryWithVanillaJpa.class})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest
class ArticleRepositoryTest{
테스트 코드
}