멀티 모듈로 @DataJpaTest 진행할때 오류
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=…) with your test
멀티 모듈에서 실제 @SpringBootApplication 같은 Spring Context를 로드 하는 부분이 없어서 인데 이부분은 test코드에서 아래처럼 로드 하는 부분을 만들어 주면 된다.
1 2 3 4 5 6
| @SpringBootApplication public class ApplicationTests { public void contextLoads() {} }
|
별도의 DataSourceConfiguration 불러오기
@Import 어너테이션을 사용해서 로드
1 2 3 4 5 6 7
| @DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) @Import(DataSourceConfiguration.class) public class RepositoryTest { }
|
The dependencies of some of the beans in the application context form a cycle
위에 내용은 순환 참조 내용인데 Bean 등록시 @DependsOn 을 할용해서 Bean들 간에 의존성을 정해주면 해결된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
@Configuration public class DataSourceConfiguration {
@Bean @ConfigurationProperties(prefix = "test.datasource-read") public DataSource readDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); }
@Bean @ConfigurationProperties(prefix = "test.datasource-write") public DataSource writeDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); }
@DependsOn({"readDataSource","writeDataSource"}) @Bean public DataSource routingDataSource(@Qualifier("writeDataSource") DataSource writeDataSource, @Qualifier("readDataSource") DataSource readDataSource) {
ReplicationRoutingDataSource routingDataSource = new ReplicationRoutingDataSource(); Map<Object, Object> dataSourceMap = new HashMap<>(); dataSourceMap.put("write", writeDataSource); dataSourceMap.put("read", readDataSource); routingDataSource.setTargetDataSources(dataSourceMap); routingDataSource.setDefaultTargetDataSource(readDataSource);
return routingDataSource; }
@DependsOn("routingDataSource") @Primary @Bean public DataSource dataSource(@Qualifier("routingDataSource") DataSource routingDataSource) { return new LazyConnectionDataSourceProxy(routingDataSource); } }
|
테스트시에 실제 DB로 테스트 하기
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 어너테이션을 활용하면 설정정보가 임베디드디비로 맴핑되는것을 방지할수있다.
참고자료