Spring boot Junit5 Test mysql 연결 및 에러:Failed to load ApplicationContext for / Failed to replace DataSource with an embedded database for tests. 해결
spring boot 3.0.2 환경에서 웹페이지를 만들기위해 Junit5 테스트를 작성했다.
@DisplayName("JPA 연결 테스트")
@Import(JpaRepositoryTest.TestJpaConfig.class)
@DataJpaTest
class JpaRepositoryTest {
private final ArticleRepository articleRepository;
private final ArticleCommentRepository articleCommentRepository;
private final UserAccountRepository userAccountRepository;
public JpaRepositoryTest(
@Autowired ArticleRepository articleRepository,
@Autowired ArticleCommentRepository articleCommentRepository,
@Autowired UserAccountRepository userAccountRepository
) {
this.articleRepository = articleRepository;
this.articleCommentRepository = articleCommentRepository;
this.userAccountRepository = userAccountRepository;
}
@DisplayName("select 테스트")
@Test
void givenTestData_whenSelecting_thenWorksFine() {
// Given
// When
List<Article> articles = articleRepository.findAll();
// Then
assertThat(articles)
.isNotNull()
.hasSize(123);
}
그런데, 실행 결과 다음과 같은 에러가 발생했다.
Failed to resolve parameter ~~
Failed to load ApplicationContext for ~~
Failed to replace DataSource with an embedded database for tests. ~~
왜 안될까 곱씹어 보다가 생각해보니, 마지막 에러를 보고 test와 datasource를 제대로 연결해주지 않았다는 생각이 들었다.
그런데 나는 @DataJpaTest 를 통해 datasource를 추가하지 않았나? 하고 생각해보니 내가 따로 embedded database를 추가하여 설정하지 않았다는 것을 깨달았다. 하지만, 내가 Test에서 원하는 것은 h2 embedded database가 아닌 실제 웹페이지 api 에서 사용하는 mysql database가 필요했고, 열심히 구글링하던 중 @AutoConfigureTestDatabase 을 사용하여 할 수 있다는 것을 알게 되었다.
https://kangwoojin.github.io/programing/auto-configure-test-database/.
@DisplayName("JPA 연결 테스트")
@Import(JpaRepositoryTest.TestJpaConfig.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class JpaRepositoryTest {
- @DatabaseTest를 사용시 자동으로 Embedded db 를 사용하기 때문에 @AutoConfigureTestDatabase 를 사용해서 덮어버리는 것이다.
- (replace = AutoConfigureTestDatabase.Replace.NONE)를 통해서 TestDatabaseAutoConfiguration에서 DataSource가 bean으로 등록되지 않게 하고 DataSourceAutoConfiguration에 의해서 DataSource가 등록되게 된다.
- 이 때 property에 설정한 dataSource의 설정 값에 따라 적절한 DataSource를 생성하게 된다. SpringBoot 2.0 이상부터는 HikariDataSource가 Default로 등록이 되게 된다


jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
generate-ddl: true
defer-datasource-initialization: true
hibernate:
ddl-auto: update
show-sql: true #날리는 쿼리 보기
그래서 나는 create로 했다가 다 날려서 update 로 바꾸고 다시 data 삽입했다.
[Error] @DataJpaTest DataSource 설정 오류
Error 상황 프로젝트 환경 설정 application.yml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/awss3?serverTimezone=UTC&characterEncoding=UTF-8 username: root password: 1234 jpa: database-platform:
charliezip.tistory.com
@SpringBootTest / @DataJpaTest 차이점 과 JPA 영속성 컨텍스트
Memory db를 이용한 Repository Test Repository layer의 테스트를 위해서 내장 Memory DB를 많이 사용합니다. Memory DB 를 사용하는 방법도 천차만별일텐데 크게는 2가지 정도라 생각됩니다. @SpringBootTest+ Memory DB
cobbybb.tistory.com